/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.controller;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import java.util.ArrayList;
import java.util.List;

import com.db.*;
import com.exception.*;
import com.javabeans.*;
import com.model.*;
import com.util.UtilDate;
import java.sql.Connection;
import java.util.Calendar;
import javax.servlet.RequestDispatcher;

/**
 * @author Administrador
 */
public class Administracion extends HttpServlet {

    HttpServletRequest request;
    HttpServletResponse response;
    HttpSession session;
    String msg = "";
    
    private String PAGE = "";
    private static final String ERROR_PAGE = "WEB-INF/error.jsp";
    private static final String ERROR_AJAX = "WEB-INF/errorAjax.jsp";
    boolean isForward = true; // inicializamos con forward....
    Usuario s_Usuario = null;
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        this.request = request;
        this.response = response;
        session = request.getSession();
        int accion = Integer.parseInt(request.getParameter("accion"));
        
        if(session.getAttribute("s_Usuario") != null){
            s_Usuario = (Usuario)session.getAttribute("s_Usuario");
            try{
                switch(accion){
                    case 1 : indexGeneral(); break;                         // accion = 1 = ir a index administracion general
                    case 2 : showHorarios(); break;                         // accion = 2 = ir a lista de horarios
                    case 3 : formPeriodo(accion); break;                    // accion = 3 = ir a formulario nuevo periodo dia
                    case 4 : newPeriodoDia(accion); break;                  // accion = 4 = registra un nuevo periodo
                    case 5 : formPeriodo(accion); break;                    // accion = 5 = ir a formulario editar periodo dia
                    case 6 : newPeriodoDia(accion); break;                  // accion = 6 = modifica periodo dia
                    case 7 : listarAulas(); break;                          // accion = 7 = ir a listar aulas
                    case 8 : formNewEditAula(accion); break;                // accion = 8 = muestra el formulario, para nueva aula
                    case 9 : newEditAula(accion); break;                    // accion = 9 = registra una aula
                    case 10 : formNewEditAula(accion); break;                        // accion = 10 = muestra el formulario para editar
                    case 11 : newEditAula(accion); break;                   // accion = 11 = edita el aula
                    case 12 : bajaAula(); break;                            // accion = 12 = dar baja aula
                    case 13 : listarPaises(); break;                        // accion = 13 = ir a listar paises
                    case 14 : newEditPais(accion); break;                   // accion = 14 = registra un pais
                    case 15 : newEditPais(accion); break;                   // accion = 14 = registra un pais
                    case 16 : deletePais(); break;                          // accion = 16 = delete pais
                    case 17 : darAltaBajaPais(accion); break;               // accion = 17 = dar baja el pais
                    case 18 : darAltaBajaPais(accion); break;               // accion = 18 = dar alta  pais
                    case 19 : listarCiudades(); break;                      // accion = 19 = lista ciudades 
                    case 20 : newEditCiudad(accion); break;                 // accion = 20 = registra una ciudad
                    case 21 : newEditCiudad(accion); break;                 // accion = 21 = modifica una ciudad
                    case 22 : deleteCiudad(); break;                        // accion = 22 = elimina una ciudad
                    case 23 : darAltaBajaCiudad(accion); break;             // accion = 23 = da de baja una ciudad
                    case 24 : darAltaBajaCiudad(accion); break;             // accion = 24 = da de alta una ciudad
                    case 25 : changePais(); break;                          // accion = 25 = muestra las ciudades de un pais
                    case 26 : listarProvincias(); break;                    // accion = 26 = lista provincias
                    case 27 : newEditProvincia(accion); break;              // accion = 27 = registra una provincia
                    case 28 : newEditProvincia(accion); break;              // accion = 28 = modifica una provincia
                    case 29 : deleteProvincia(); break;                     // accion = 29 = elimina una provincia
                    case 30 : darAltaBajaProvincia(accion); break;          // accion = 30 = da de baja una provincia
                    case 31 : darAltaBajaProvincia(accion); break;          // accion = 31 = da de alta una provincia
                    case 32 : changePaisForProvinc(); break;                // accion = 32 = muestra las ciudades de un pais
                    case 33 : listarCategorias(); break;                    // accion = 33 = lista categorias de docente
                    case 34 : newEditCategoria(accion); break;              // accion = 34 = registra una nueva categoria
                    case 35 : newEditCategoria(accion); break;              // accion = 35 = edita una nueva categoria
                    case 36 : deleteCategoria(); break;                     // accion = 36 = elimina una categoria
                    case 37 : darAltaBajaCategoria(accion); break;          // accion = 37 = dar baja categoria
                    case 38 : darAltaBajaCategoria(accion); break;          // accion = 38 = dar alta categoria
                    case 39 : indexAdminAcademico(); break;                 // accion = 39 = va a index academico    
                    case 40 : listarFacultades(); break;                    // accion = 40 = lista facultades
                    case 41 : newEditFacultad(accion); break;               // accion = 41 = nueva facultad
                    case 42 : newEditFacultad(accion); break;               // accion = 42 = modifica facultad
                    case 43 : deleteFacultad(); break;                      // accion = 43 = elimina una facultad
                    case 44 : darAltaBajaFacultad(accion); break;           // accion = 44 = baja facultad
                    case 45 : darAltaBajaFacultad(accion); break;           // accion = 45 = alta facultad
                    case 46 : listarDeptos(); break;                        // accion = 46 = lista departamentos
                    case 47 : newEditDepto(accion); break;                  // accion = 47 = registra departamento
                    case 48 : newEditDepto(accion); break;                  // accion = 48 = edita departamento
                    case 49 : deleteDepto(); break;                         // accion = 49 = elimina un departamento
                    // carlos    
                    case 50 : indexRecursosHumanos(); break;                // accion = 50 = muestra el inicio de rrhh
                    case 51 : listarDocentes(); break;                      // accion = 51 = listamos docentes
                    case 52 : formNewEditDocente(accion); break;            // accion = 52 = form para nuevo docente
                    case 53 : newEditDocente(accion); break;                // accion = 53 = para insertar y editar docentes
                    case 54 : formNewEditDocente(accion); break;            // accion = 54 = form para editar docente
                    case 55 : newEditDocente(accion); break;                // accion = 55 = update docente
                    case 56 : darAltaBajaDocente(accion); break;            // accion = 56 = dar de baja docente
                    case 57 : darAltaBajaDocente(accion); break;            // accion = 57 = dar de alta docente
                    case 58 : deleteDocente(); break;                       // accion = 58 = eliminar docente
                    case 59 : listarEstudiantes(); break;                   // accion = 59 = listamos estudiantes
                    case 60 : formNewEditEstudiante(accion); break;         // accion = 60 = form para nuevo estudiante
                    case 61 : newEditEstudiante(accion); break;             // accion = 61 = para insertar estudiante
                    case 62 : formNewEditEstudiante(accion); break;         // accion = 62 = form para editar estudiante
                    case 63 : newEditEstudiante(accion); break;             // accion = 63 = update estudiante
                    case 64 : darAltaBajaEstudiante(accion); break;         // accion = 64 = dar de baja estudiante
                    case 65 : darAltaBajaEstudiante(accion); break;         // accion = 65 = dar de alta estudiante
                    case 66 : deleteEstudiante(); break;                    // accion = 66 = eliminar estudiante
                    case 67 : listarAdmin(); break;                         // accion = 67 = listamos administradores
                    case 68 : formNewEditAdmin(accion); break;              // accion = 68 = form nuevo admin
                    case 69 : newEditAdmin(accion); break;                  // accion = 69 = para insertar administrativo
                    case 70 : existeLoginAjax(); break;                     // accion = 70 = para verificar si esq esta disponible el login
                    case 71 : formNewEditAdmin(accion); break;              // accion = 71 = form edit admin
                    case 72 : newEditAdmin(accion); break;                  // accion = 72 = para update administrativo
                    case 73 : darAltaBajaAdmin(accion); break;              // accion = 73 = dar de baja admin
                    case 74 : darAltaBajaAdmin(accion); break;              // accion = 74 = dar de alta admin
                    case 75 : indexParametro(); break;                      // accion = 75 = inicio de parametro
                    case 76 : listarIsXfacultadMatricula(accion); break;    // accion = 76 = listamos el parametro
                    case 77 : listarIsXfacultadMatricula(accion); break;    // accion = 77 = update por facultad
                        
                    case 81 : darAltaBajaDepto(accion); break;              // accion = 81 = dar baja departamento
                    case 82 : darAltaBajaDepto(accion); break;              // accion = 81 = dar alta departamento    
                    case 83 : listarCargos(); break;                        // accion = 83 = lista cargos  
                    case 84 : newEditCargo(accion); break;                  // accion = 84 = registra un cargo
                    case 85 : newEditCargo(accion); break;                  // accion = 85 = edita actualiza un cargo
                    case 86 : deleteCargo(); break;                         // accion = 86 = elimna cargo
                    case 87 : darAltaBajaCargo(accion); break;              // accion = 87 = dar baja el cargo
                    case 88 : darAltaBajaCargo(accion); break;              // accion = 88 = da alta un cargo

                    case 89 : listarCarreras(); break;                      // accion = 89 = lista carreras
                    case 90 : newEditCarrera(accion); break;                // accion = 90 = registra carrera
                    case 91 : newEditCarrera(accion); break;                // accion = 91 = edita carrera
                    case 92 : deleteCarrera(); break;                       // accion = 92 = elimina una carrera
                    case 93 : darAltaBajaCarrera(accion); break;            // accion = 93 = dar baja carrera
                    case 94 : darAltaBajaCarrera(accion); break;            // accion = 94 = dar alta carrera
                        
                    case 95 : boxCarreras(); break;                         // accion = 95 = muestra carreras para seleccionar
                    case 96 : listarMateriasPorCarrera(); break;            // accion = 96 = listar materias por carrera
                    case 97 : newEditMateria(accion); break;                // accion = 97 = registra una materia
                    case 98 : newEditMateria(accion); break;                // accion = 98 = edita actualiza una materia
                    case 99 : deleteMateria(); break;                       // accion = 99 = elimna materia
                    case 100 : darAltaBajaMateria(accion); break;           // accion = 100 = dar baja materia
                    case 101 : darAltaBajaMateria(accion); break;           // accion = 101 = da alta una materia    
                    case 102 : pensumCarrera(); break;                      // accion = 102 = muestra el pensum de la carrera
                        
                    case 103 : listarGestiones(); break;                    // accion = 103 = lista gestiones
                    case 104 : newEditGestion(accion); break;               // accion = 104 = crea una nueva gestion
                    case 105 : newEditGestion(accion); break;               // accion = 105 = modifica gestion
                    case 106 : deleteGestion(); break;                      // accion = 106 = elimina una gestion
                    case 107 : cerrarGestion(); break;                      // accion = 107 = cierra una gestion
                    case 108 : newEditPensum(accion); break;                // accion = 108 = registra un pensum de una carrera
                    case 109 : newEditPensum(accion); break;                // accion = 109 = edita un pensum de una carrera
                    case 110 : darBajaPensum(); break;                      // accion = 109 = edita un pensum de una carrera
                        
                    case 111 : verPlanEstudio(); break;                     // accion = 111 = lista el plan de estudios de un pensum
                    case 112 : newPlanEstudio(); break;                     // accion = 112 = new plan estudio
                    case 113 : bajaAltaMatPen(accion); break;               // accion = 113 = dar baja materia del plan de estudio
                    case 114 : bajaAltaMatPen(accion); break;               // accion = 114 = dar alta mataria del plan de estudio
                    case 115 : eliminarMatPen(); break;                     // accion = 115 = elimina una materia del plan de estudio
                        
                    case 116 : indexIti(); break;                           // accion = 116 = muestra el itinerario de grupos 
                    case 117 : verItiGrupos(); break;                       // accion = 117 = muestra el itinerario de grupos por carrera 
                    case 118 : formNewEditItiGrupo(accion); break;          // accion = 118 = nuevo itinerario grupo
                    case 119 : formNewEditItiGrupo(accion); break;          // accion = 119 = edita itinerario grupo
                    case 120 : nroGrupo(accion); break;                     // accion = 120 = optiene el num grupo para el itinerario
                    case 121 : newEditItiGrupo(accion); break;              // accion = 121 = edita itinerario grupo
                    case 122 : newEditItiGrupo(accion); break;              // accion = 122 = edita itinerario grupo
                    case 123 : indexH(); break;                             // accion = 123 = ir a index horario
                    case 124 : eliminarGrupoIti(); break;                   // accion = 124 = eliminar un grupo de itinerario
                        
                    case 125 : indexGrupos(); break;                        // accion = 125 = va a index grupos
                    case 126 : verGrupos(); break;                          // accion = 126 = ver grupos
                    case 127 : formNewEditGrupo(accion); break;             // accion = 127 = formulario nuevo grupo
                    case 128 : formNewEditGrupo(accion); break;             // accion = 128 = formulario editar grupo   
                    case 129 : nroGrupo(accion); break;                     // accion = 129 = optiene el num grupo
                    case 130 : newEditGrupo(accion); break;                 // accion = 130 = nuevo grupo
                    case 131 : newEditGrupo(accion); break;                 // accion = 131 = edita grupo
                    case 132 : eliminarGrupo(); break;                      // accion = 132 = eliminar un grupo
                    case 133 : existeInscritosEnElGrupo(); break;           // accion = 133 = existe inscritos en el grupo
                    case 134 : darBajaAltaGrupo(accion); break;             // accion = 134 = dar baja un grupo
                    case 135 : darBajaAltaGrupo(accion); break;             // accion = 135 = dar alta un grupo
                        
                    case 136 : formGenerarGrupos(); break;                  // accion = 136 = formulario para generar grupos
                    case 137 : verItiGruposPorFacultad(); break;            // accion = 137 = muestra los grupos de itinerario por facultad
                    case 138 : generarGrupos(); break;                      // accion = 138 = generar grupos por facultad para una gestion
                    case 139 : indexAdministracion(); break;                // accion = 139 = Ir a princiarpal de administracion
                        
                    default : System.out.println(" accion = "+accion+" no existe en Administracion.java"); throw new DataException("accion = "+accion+" no existe en Transacciones.java");
                }
            }catch(DataException e){
                throw new ServletException(e);
            }
        }else
            PAGE = "web/index.jsp?msg=Indentifiquese. La Session no existe!";
        if(PAGE.length() > 0){
            if(isForward){
                RequestDispatcher dispatch = request.getRequestDispatcher(PAGE);
                dispatch.forward(request,response);
            }else{
                response.sendRedirect(PAGE);
            }
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private void indexGeneral() {
        PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/index.jsp";
    }
    
    public void showHorarios()throws DataException{// accion = 2 = muestra los horarios
        Connection c = null;
        int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
        try{
            c = Conector.getConexion();
            FacultadManager fmanager = ManagerFactory.getFacultadManagerInstance(c);
            DiaSemanaManager dsmanger = ManagerFactory.getDiaSemanaManagerInstance(c);
            PeriodoDiaManager pdmanager = ManagerFactory.getPeriodoDiaManagerInstance(c);
            HorarioManager hmanager = ManagerFactory.getHorarioManagerInstance(c);
            request.setAttribute("Facultad", fmanager.getFacultad(idFacultad));
            request.setAttribute("diasSemana", dsmanger.getDiasHorario());
            request.setAttribute("periodosDia", pdmanager.getPeriodosDia(idFacultad));
            request.setAttribute("horarios", hmanager.getHorariosBasic(idFacultad));
            // isRedirect = false;
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/AdminHorario/horarios.jsp?idMenu=1&idSubMenu=2&idOpcion=2";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> showHorarios() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> showHorarios() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> showHorarios() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> showHorarios() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void formPeriodo(int accion)throws DataException{
        // accion = 3 = formulario nuevo periodo dia
        Connection c = null;
        int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
        String nomFac = request.getParameter("nomFac");
        try{
            c = Conector.getConexion();
            DiaSemanaManager dsmanger = ManagerFactory.getDiaSemanaManagerInstance(c);
            if(accion == 5){ // si es editar
                int idPeriodoDia = Integer.parseInt(request.getParameter("idDiaPeriodo"));
                String dias = request.getParameter("dias");
                PeriodoDiaManager pdmanager = ManagerFactory.getPeriodoDiaManagerInstance(c);
                PeriodoDia pd = pdmanager.getPeriodoDia(idFacultad,idPeriodoDia);
                request.setAttribute("PeriodoDia", pd);
                request.setAttribute("dias", dias);
            }
            request.setAttribute("idFacultad", idFacultad);
            request.setAttribute("nomFac", nomFac);
            request.setAttribute("diasSemana", dsmanger.getDiasHorario());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/AdminHorario/formulario.jsp?idMenu=1&idSubMenu=2&idOpcion=2";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formPeriodo() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formPeriodo() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formPeriodo() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formPeriodo() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newPeriodoDia(int accion)throws DataException{
        // accion = 4 = registra un nuevo periodo AND accion = 6 = editar periodo dia
        PAGE = "";
        Connection c = null;
        int i = 0;
        int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
        int idPeriodoDia = Integer.parseInt(request.getParameter("idPeriodoDia"));
        String horaIni = request.getParameter("timepicker_start");
        String horaFin = request.getParameter("timepicker_end");
        String[] dias = request.getParameterValues("diasSemana");
        try{
            c = Conector.getConexion();
            PeriodoDiaManager pdmanager = ManagerFactory.getPeriodoDiaManagerInstance(c);
            HorarioManager hmanager = ManagerFactory.getHorarioManagerInstance(c);
            
            PeriodoDia pd = new PeriodoDia();
            pd.setIdFacultad(idFacultad);
            pd.setHoraIni(horaIni);
            pd.setHoraFin(horaFin);
            pd.setEstraordinario(false);
            if(accion == 4){
                idPeriodoDia = pdmanager.getIdPeriodoDia(idFacultad);
                pd.setIdPeriodoDia(idPeriodoDia);
                pdmanager.savePeriodoDia(pd);
                msg = "El periodo se registro correctamente. Verifique datos!";
            }else{
                hmanager.deletePorPeriodo(idFacultad,idPeriodoDia); // elimino dias que tenia anteriormente
                pd.setIdPeriodoDia(idPeriodoDia);
                pdmanager.editPeriodoDia(pd);
                msg = "El perido se modifico correctamente. Verifique datos!";
            }
            
            List<Horario> horarios = new ArrayList<Horario>();
            for(String val: dias){
                i = val.indexOf("_");
                int idDia = Integer.parseInt(val.substring(0, i));
                val = val.substring(i+1);
                DiaSemana ds = new DiaSemana();
                ds.setNombre(val);
                
                Horario h = new Horario();
                h.setIdFacultad(idFacultad);
                h.setIdDiaSemana(idDia);
                h.setIdPeriodoDia(idPeriodoDia);
                h.setActivo(true);
                h.setDiaSemana(ds);
                horarios.add(h);
            }
            hmanager.saveHorarios(horarios);
            
            // construimos el html de respuesta
            PrintWriter out = response.getWriter();
            out.println("<h2 class='decorado'>"+msg+"</h2><br/>");
            out.println("<div style='clear:both'>");
            out.println("    <label class='form_align43'>Hora Inicio :&nbsp;&nbsp;"+pd.getHoraIni()+"</label>");
            out.println("</div><br/>");
            out.println("<div style='clear:both'>");
            out.println("    <label class='form_align43'>Hora Fin :&nbsp;&nbsp;"+pd.getHoraFin()+"</label>");
            out.println("</div><br/>");
            
            out.println("<div style='clear:both'>");
            out.println("   <label class='form_align43'>Periodo Habilitados para los D&iacute;as :</label>");
            out.println("       <div style='float:left'>");
            for(Horario h:horarios){
                out.println("<div><label>&nbsp;&nbsp;"+h.getDiaSemana().getNombre()+"</label></div>");
            }
            out.println("<br/>");
            out.println("       </div>");
            out.println("</div><br/>");
            out.println("<table class='miReporte' style='width: 100%'>");
            out.println("    <tr><td style='text-align: center'><input type='button' class='boton' value='Ir a Horarios' onClick='ir_a_horarios("+idFacultad+")'/>&nbsp;&nbsp;<input type='button' name='addPeriodo' onClick='addPeriodo()' class='boton' value='Añadir Nuevo Periodo d&iacute;a' /></td></tr>");
            out.println("</table>");
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> newPeriodoDia() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newPeriodoDia() DataException "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> newPeriodoDia() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newPeriodoDia() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
            System.out.println("ERROR_AJAX = "+ERROR_AJAX);
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void listarAulas()throws DataException{
        // accion = 7 = ir a listar aulas
        Connection c = null;
        try{
            c = Conector.getConexion();
            AulaManager amanager = ManagerFactory.getAulaManagerInstance(c);
            List<Aula> aulas = amanager.getAulas();
            request.setAttribute("aulas", aulas);
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/AdminAula/aulas.jsp?idMenu=1&idSubMenu=2&idOpcion=1";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarAulas() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarAulas() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarAulas() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarAulas() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditAula(int accion)throws DataException{
        // accion = 9 = registra una aula, accion = 11 = Edita una aula
        PAGE = "";
        Connection c = null;
        int idAula = Integer.parseInt(request.getParameter("idAula"));
        String nro = request.getParameter("nroAula");
        String descripcion = request.getParameter("descripcion");
        int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
        String nomFac = request.getParameter("nomFac");
        try{
            c = Conector.getConexion();
            AulaManager amanager = ManagerFactory.getAulaManagerInstance(c);
            Aula a = new Aula();
            a.setNro(nro);
            a.setDescripcion(descripcion);
            a.setActivo(true);
            a.setIdFacultad(idFacultad);
            if(accion == 9){
                idAula = amanager.getIdAula();
                a.setIdAula(idAula);
                amanager.saveAula(a);
                msg = "El aula Nro. "+a.getNro()+" se registro correctamente. Verifique los datos!";
            }else{ // para editar aula
                a.setIdAula(idAula);
                amanager.updateAula(a);
                msg = "El aula Nro. "+a.getNro()+" se modifico correctamente. Verifique los datos!";
            }
            // construimos el html de respuesta
            PrintWriter out = response.getWriter();
            out.println("<h2 class='decorado'>"+msg+"</h2><br/>");
            out.println("<div style='clear:both'>");
            out.println("    <label class='form_align43'>Facultad :&nbsp;&nbsp;</label>");
            out.println("<b>"+nomFac+"</b>");
            out.println("</div><br/>");
            out.println("<div style='clear:both'>");
            out.println("    <label class='form_align43'>N&uacute;mero Aula :&nbsp;&nbsp;</label>");
            out.println("<b>"+a.getNro()+"</b>");
            out.println("</div><br/>");
            out.println("<div style='clear:both'>");
            out.println("    <label class='form_align43'>Descripci&oacute;n Aula :&nbsp;&nbsp;</label>");
            out.println("<b>"+a.getDescripcion()+"</b>");
            out.println("</div><br/><br/>");
            
            out.println("<table class='miReporte' style='width: 100%'>");
            out.println("    <tr><td style='text-align: center'><input type='button' class='boton' value='Ir a lista de aulas' onClick='listarAulas()'/>&nbsp;&nbsp;");
            if(accion == 9)
                out.println("       <input type='button' name='addPeriodo' onClick='addAula()' class='boton' value='Añadir Nueva Aula' />");
            out.println("   </td></tr>");
            out.println("</table>");
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditAula() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditAula() DataException "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditAula() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditAula() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void formNewEditAula(int accion)throws DataException{
        // // accion = 8 = muestra el formulario, para nueva aula, accion = 10 = muestra el formulario para editar
        Connection c = null;
        int idAula = 0;
        try{
            c = Conector.getConexion();
            AulaManager amanager = ManagerFactory.getAulaManagerInstance(c);
            FacultadManager fmanager = ManagerFactory.getFacultadManagerInstance(c);
            if(accion != 8){
                idAula = Integer.parseInt(request.getParameter("idAula"));
                Aula a = amanager.getAula(idAula);
                request.setAttribute("Aula", a);
            }
            request.setAttribute("facultades", fmanager.getFacultades());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/AdminAula/formAula.jsp?idMenu=1&idSubMenu=2&idOpcion=1";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarAulas() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarAulas() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarAulas() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarAulas() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void bajaAula()throws DataException{
        // accion = 12 = dar baja aula
        Connection c = null;
        int idAula = Integer.parseInt(request.getParameter("idAula"));
        try{
            c = Conector.getConexion();
            AulaManager amanager = ManagerFactory.getAulaManagerInstance(c);
            amanager.darBajaAula(idAula);
            msg = "El aula Nro. ''"+request.getParameter("nro") +"'' se dio de baja correctamente!";
            request.setAttribute("msg", msg);
            this.listarAulas();
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> bajaAula() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> bajaAula() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> bajaAula() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> bajaAula() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void listarPaises()throws DataException{
        // accion = 13 = ir a listar paises
        Connection c = null;
        try{
            c = Conector.getConexion();
            PaisManager pmanager = ManagerFactory.getPaisManagerInstance(c);
            request.setAttribute("paises", pmanager.getPaises());
            request.setAttribute("paisesBaja", pmanager.getPaisesDadosDeBaja());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/AdminPais/paises.jsp?idMenu=1&idSubMenu=2&idOpcion=3";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarPaises() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarPaises() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarPaises() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarPaises() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditPais(int accion)throws DataException{
        // accion = 14 = registra un pais, accion = 15 = actualiza datos de pais
        PAGE = "";
        Connection c = null;
        int idPais = 0;
        String nombre = request.getParameter("nombre");
        String sigla = request.getParameter("sigla");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            PaisManager pmanager = ManagerFactory.getPaisManagerInstance(c);
            Pais p = new Pais();
            p.setNombre(nombre);
            p.setSigla(sigla);
            if(accion == 14){
                idPais = pmanager.getIdPais();
                p.setIdPais(idPais);
                pmanager.savePais(p);
                msg = "<p style='text-align:center;color:blue'>El pais ''"+nombre.toUpperCase()+"'' se registro correctamente!</p>";
            }else{
                idPais = Integer.parseInt(request.getParameter("idPais"));
                p.setIdPais(idPais);
                pmanager.updatePais(p);
                msg = "<p style='text-align:center;color:blue'>El pais ''"+nombre.toUpperCase()+"'' se actualizo correctamente!</p>";
            }
            List<Pais> paises = pmanager.getPaises();
            List<Pais> paisesInactivos = pmanager.getPaisesDadosDeBaja();
            this.showPaises(paises, paisesInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newPais() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newPais() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newPais() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newPais() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void deletePais()throws DataException{
        // accion = 16 = elimina un pais
        PAGE = "";
        Connection c = null;
        int idPais = Integer.parseInt(request.getParameter("idPais"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            PaisManager pmanager = ManagerFactory.getPaisManagerInstance(c);
            if(!pmanager.isUseInDetalleEst(idPais)){ // si no es usado recien se elimina
                pmanager.deletePais(idPais);
                msg = "<p style='text-align:center;color:blue'>El pais ''"+nombre.toUpperCase()+"'' y sus dependencias de ciudad y provincia, se eliminaron correctamente!</p>";
            }else{
                msg = "<p style='text-align:center;color:red'>No se puede eliminar el pais ''"+nombre.toUpperCase()+"'', ¡esta ciendo usado!. Se sugiere dar de baja!</p>";
            }
            List<Pais> paises = pmanager.getPaises();
            List<Pais> paisesInactivos = pmanager.getPaisesDadosDeBaja();
            this.showPaises(paises, paisesInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deletePais() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deletePais() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deletePais() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deletePais() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void darAltaBajaPais(int accion)throws DataException{
        // accion = 17 = dar baja el pais, accion = 18 = dar alta  pais
        PAGE = "";
        Connection c = null;
        int idPais = Integer.parseInt(request.getParameter("idPais"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            PaisManager pmanager = ManagerFactory.getPaisManagerInstance(c);
            if(accion == 17){
                pmanager.darBaja(idPais);
                msg = "<p style='text-align:center;color:blue'>El pais ''"+nombre.toUpperCase()+"'' y sus dependencias de ciudad y provincia, se dieron de BAJA correctamente!</p>";
            }else{
                pmanager.darAlta(idPais);
                msg = "<p style='text-align:center;color:blue'>El pais ''"+nombre.toUpperCase()+"'' y sus dependencias de ciudad y provincia, se dieron de ALTA correctamente!</p>";
            }
            List<Pais> paises = pmanager.getPaises();
            List<Pais> paisesInactivos = pmanager.getPaisesDadosDeBaja();
            this.showPaises(paises, paisesInactivos,msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darBajaPais() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darBajaPais() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darBajaPais() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darBajaPais() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    private void showPaises(List<Pais> paises, List<Pais> paisesInactivos, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Lista de Paises</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 80%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Anadir Nuevo Pa&iacute;s' onclick='$.fn.addPais()'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 80%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='40%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(Pais p : paises){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+p.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+p.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Editar' onclick='$.fn.editar("+p.getIdPais()+",\""+p.getNombre()+"\",\""+p.getSigla()+"\")' class='botonRep' title='Pulsa aqui para editar aula'/>");
            out.println("        <input type='button' value='Dar Baja' onClick='$.fn.darBaja("+p.getIdPais()+",\""+p.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de baja el pais'/>");
            out.println("        <input type='button' value='Eliminar' onClick='$.fn.eliminar("+p.getIdPais()+",\""+p.getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar el pais'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='4' style='text-align:center'><p style='color:red'>No existen Paises registrados!<p></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        
        out.println("<!-- boton que muestra y oculta los paises dedos de baja -->");
        out.println("<table class='miReporte' style='width: 80%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar bajas'/></td>");
        out.println("    </tr>");
        out.println("</table>      <br/><br/>");
        
        // =========================== PAISES DADOS DE BAJA ============================
        out.println("<div id='paisesBaja' style='display:none'>");
        
        out.println("<h2 class='decorado'>Lista de Paises dados de Baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 80%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='40%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>ACCION</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(Pais p : paisesInactivos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+p.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+p.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("       <input type='button' value='Dar Alta' onClick='$.fn.darAlta("+p.getIdPais()+",\""+p.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de alta el pais "+p.getNombre()+"'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='4' style='text-align:center'><p style='color:red'>No existen Paises dados de BAJA!<p></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        out.println("</div> <!-- end id='paisesBaja' -->");
    }
    
    public void listarCiudades()throws DataException{
        // accion = 19 = lista ciudades 
        Connection c = null;
        try{
            c = Conector.getConexion();
            PaisManager pmanager = ManagerFactory.getPaisManagerInstance(c);
            CiudadManager cmanager = ManagerFactory.getCiudadManagerInstance(c);
            Pais pDefault = pmanager.getPaisDefault();
            request.setAttribute("pDefault", pDefault);
            List<Ciudad> ciudadesPorPais = cmanager.getCiudadesPorPaisBasic(pDefault.getIdPais());
            List<Ciudad> ciudadesInactivos = cmanager.getCiudadesPorPaisInactivos(pDefault.getIdPais());
            request.setAttribute("ciudadesPorPais", ciudadesPorPais);
            request.setAttribute("ciudadesInactivos", ciudadesInactivos);
            request.setAttribute("paises", pmanager.getPaises());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/AdminCiudad/ciudades.jsp?idMenu=1&idSubMenu=2&idOpcion=4";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarCiudades() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarCiudades() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarCiudades() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarCiudades() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditCiudad(int accion)throws DataException{
        // accion = 20 = registra una ciudad, accion = 21 = modifica una ciudad
        PAGE = "";
        Connection c = null;
        int idPais = Integer.parseInt(request.getParameter("idPais"));
        String nombrePais = request.getParameter("nombrePais");
        int idCiudad = 0;
        String nombre = request.getParameter("nombre");
        String sigla = request.getParameter("sigla");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CiudadManager cmanager = ManagerFactory.getCiudadManagerInstance(c);
            Ciudad ciu = new Ciudad();
            ciu.setIdPais(idPais);
            ciu.setNombre(nombre);
            ciu.setSigla(sigla);
            if(accion == 20){
                idCiudad = cmanager.getIdCiudad(idPais);
                ciu.setIdCiudad(idCiudad);
                ciu.setActivo(true);
                cmanager.saveCiudad(ciu);
                msg = "<p style='text-align:center;color:blue'>La ciudad ''"+nombre.toUpperCase()+"'' se registro correctamente!</p>";
            }else{
                idCiudad = Integer.parseInt(request.getParameter("idCiudad"));
                ciu.setIdCiudad(idCiudad);
                cmanager.updateCiudad(ciu);
                msg = "<p style='text-align:center;color:blue'>La ciudad ''"+nombre.toUpperCase()+"'' se modifico correctamente!</p>";
            }
            List<Ciudad> ciudadesPorPais = cmanager.getCiudadesPorPaisBasic(idPais);
            List<Ciudad> ciudadesInactivos = cmanager.getCiudadesPorPaisInactivos(idPais);
            this.showCiudades(ciudadesPorPais, ciudadesInactivos, nombrePais, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newPais() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newPais() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newPais() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newPais() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void deleteCiudad()throws DataException{
        // accion = 22 = elimina una ciudad
        PAGE = "";
        Connection c = null;
        int idPais = Integer.parseInt(request.getParameter("idPais"));
        int idCiudad = Integer.parseInt(request.getParameter("idCiudad"));
        String nombre = request.getParameter("nombre");
        String nombrePais = request.getParameter("nombreP");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CiudadManager cmanager = ManagerFactory.getCiudadManagerInstance(c);
            if(!cmanager.isUseInDetalleEst(idPais, idCiudad)){ // si no es usado recien se elimina
                cmanager.deleteCiudad(idPais, idCiudad);
                msg = "<p style='text-align:center;color:blue'>La ciudad ''"+nombre.toUpperCase()+"'' se eliminaron correctamente!</p>";
            }else{
                msg = "<p style='text-align:center;color:red'>No se puede eliminar la ciudad ''"+nombre.toUpperCase()+"'', ¡esta ciendo usado!. Se sugiere dar de baja!</p>";
            }
            List<Ciudad> ciudadesPorPais = cmanager.getCiudadesPorPaisBasic(idPais);
            List<Ciudad> ciudadesInactivos = cmanager.getCiudadesPorPaisInactivos(idPais);
            this.showCiudades(ciudadesPorPais, ciudadesInactivos, nombrePais, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteCiudad() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteCiudad() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteCiudad() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteCiudad() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void darAltaBajaCiudad(int accion)throws DataException{
        // accion = 23 = dar de baja una ciudad,
        PAGE = "";
        Connection c = null;
        int idPais = Integer.parseInt(request.getParameter("idPais"));
        int idCiudad = Integer.parseInt(request.getParameter("idCiudad"));
        String nombre = request.getParameter("nombre");
        String nombrePais = request.getParameter("nombreP");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CiudadManager cmanager = ManagerFactory.getCiudadManagerInstance(c);
            if(accion == 23){
                cmanager.darBaja(idPais, idCiudad);
                msg = "<p style='text-align:center;color:blue'>La ciudad ''"+nombre.toUpperCase()+"'' se dio de BAJA correctamente!</p>";
            }else{
                cmanager.darAlta(idPais, idCiudad);
                msg = "<p style='text-align:center;color:blue'>La ciudad ''"+nombre.toUpperCase()+"'' se dio de ALTA correctamente!</p>";
            }
            List<Ciudad> ciudadesPorPais = cmanager.getCiudadesPorPaisBasic(idPais);
            List<Ciudad> ciudadesInactivos = cmanager.getCiudadesPorPaisInactivos(idPais);
            this.showCiudades(ciudadesPorPais, ciudadesInactivos, nombrePais, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> darAltaBajaCiudad() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> darAltaBajaCiudad() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> darAltaBajaCiudad() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en! Administracion -> darAltaBajaCiudad() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void changePais()throws DataException{
        // accion = 25 = muestra las ciudades de un pais
        PAGE = "";
        Connection c = null;
        int idPais = Integer.parseInt(request.getParameter("idPais"));
        String nombre = request.getParameter("nombre").trim();
        try{
            c = Conector.getConexion();
            CiudadManager cmanager = ManagerFactory.getCiudadManagerInstance(c);
            List<Ciudad> ciudadesPorPais = cmanager.getCiudadesPorPaisBasic(idPais);
            List<Ciudad> ciudadesInactivos = cmanager.getCiudadesPorPaisInactivos(idPais);
            this.showCiudades(ciudadesPorPais, ciudadesInactivos, nombre, "");
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> changePais() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> changePais() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> changePais() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> changePais() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    private void showCiudades(List<Ciudad> ciudadesPorPais, List<Ciudad> ciudadesInactivos, String nomP, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Lista de Ciudades de ''"+nomP+"''</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 80%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Anadir Nueva Ciudad' onclick='$.fn.addCiudad()'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 80%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='40%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(Ciudad c : ciudadesPorPais){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+c.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+c.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Editar' onclick='$.fn.editar("+c.getIdCiudad()+",\""+c.getNombre()+"\",\""+c.getSigla()+"\")' class='botonRep' title='Pulsa aqui para editar la ciudad'/>");
            out.println("        <input type='button' value='Dar Baja' onClick='$.fn.darBaja("+c.getIdCiudad()+",\""+c.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de baja el la ciudad'/>");
            out.println("        <input type='button' value='Eliminar' onClick='$.fn.eliminar("+c.getIdCiudad()+",\""+c.getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar la ciudad'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='4' style='text-align:center'><p style='color:red'>No existen ciudades registrados para ''"+nomP+"''!<p></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        
        out.println("<!-- boton que muestra y oculta los paises dedos de baja -->");
        out.println("<table class='miReporte' style='width: 80%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar bajas'/></td>");
        out.println("    </tr>");
        out.println("</table>      <br/><br/>");
        
        // =========================== PAISES DADOS DE BAJA ============================
        out.println("<div id='ciudadesBaja' style='display:none'>");
        
        out.println("<h2 class='decorado'>Ciudades dados de Baja de ''"+nomP+"''</h2>");
        out.println("<table class='tabla_decorado' style='width: 80%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='40%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>ACCION</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(Ciudad c : ciudadesInactivos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+c.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+c.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("       <input type='button' value='Dar Alta' onClick='$.fn.darAlta("+c.getIdCiudad()+",\""+c.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de alta la ciudad de \""+c.getNombre()+"\"'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='4' style='text-align:center'><p style='color:red'>No existen Ciudades dados de BAJA!<p></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
    }
    
    public void listarCategorias()throws DataException{
        // accion = 33 = lista categorias de docente
        Connection c = null;
        try{
            c = Conector.getConexion();
            CategoriaManager cmanager = ManagerFactory.getCategoriaManagerInstance(c);
            request.setAttribute("categorias", cmanager.getCategorias());
            request.setAttribute("categoriasBaja", cmanager.getCategoriasDadosDeBaja());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/AdminCategoria/categorias.jsp?idMenu=1&idSubMenu=2&idOpcion=7";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarCategorias() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarCategorias() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarCategorias() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarCategorias() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditCategoria(int accion)throws DataException{
        // accion = 34 = registra una nueva categoria, accion = 35 = edita una nueva categoria
        PAGE = "";
        Connection c = null;
        int idCategoria = 0;
        String nombre = request.getParameter("nombre");
        String sigla = request.getParameter("sigla");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CategoriaManager cmanager = ManagerFactory.getCategoriaManagerInstance(c);
            Categoria ca = new Categoria();
            ca.setNombre(nombre);
            ca.setSigla(sigla);
            if(accion == 34){
                idCategoria = cmanager.getIdCategoria();
                ca.setIdCategoria(idCategoria);
                ca.setActivo(true);
                cmanager.saveCategoria(ca);
                msg = "<p style='text-align:center;color:blue'>La categoria ''"+nombre.toUpperCase()+"'' se registro correctamente!</p>";
            }else{
                idCategoria = Integer.parseInt(request.getParameter("idCategoria"));
                ca.setIdCategoria(idCategoria);
                cmanager.updateCategoria(ca);
                msg = "<p style='text-align:center;color:blue'>La categoria ''"+nombre.toUpperCase()+"'' se modifico correctamente!</p>";
            }
            List<Categoria> categorias = cmanager.getCategorias();
            List<Categoria> categoriasInactivos = cmanager.getCategoriasDadosDeBaja();
            this.showCategorias(categorias, categoriasInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newPais() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newPais() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newPais() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newPais() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void deleteCategoria()throws DataException{
        // accion = 36 = elimina una categoria
        PAGE = "";
        Connection c = null;
        int idCategoria = Integer.parseInt(request.getParameter("idCategoria"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CategoriaManager cmanager = ManagerFactory.getCategoriaManagerInstance(c);
            if(!cmanager.isUseInDetalleDoc(idCategoria)){ // si no es usado recien se elimina
                cmanager.deleteCategoria(idCategoria);
                msg = "<p style='text-align:center;color:blue'>La categoria ''"+nombre.toUpperCase()+"'' se elimino correctamente!</p>";
            }else{
                msg = "<p style='text-align:center;color:red'>No se puede eliminar la categoria ''"+nombre.toUpperCase()+"'', ¡esta ciendo usado!. Se sugiere dar de baja!</p>";
            }
            List<Categoria> categorias = cmanager.getCategorias();
            List<Categoria> categoriasInactivos = cmanager.getCategoriasDadosDeBaja();
            this.showCategorias(categorias, categoriasInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteCategoria() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteCategoria() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteCategoria() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteCategoria() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void darAltaBajaCategoria(int accion)throws DataException{
        // accion = 37 = dar baja categoria, accion = 38 = dar alta categoria
        PAGE = "";
        Connection c = null;
        int idCategoria = Integer.parseInt(request.getParameter("idCategoria"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CategoriaManager cmanager = ManagerFactory.getCategoriaManagerInstance(c);
            if(accion == 37){
                cmanager.darBaja(idCategoria);
                msg = "<p style='text-align:center;color:blue'>La categoria ''"+nombre.toUpperCase()+"'' se dieron de BAJA correctamente!</p>";
            }else{
                cmanager.darAlta(idCategoria);
                msg = "<p style='text-align:center;color:blue'>La categoria ''"+nombre.toUpperCase()+"'' se dieron de ALTA correctamente!</p>";
            }
            List<Categoria> categorias = cmanager.getCategorias();
            List<Categoria> categoriasInactivos = cmanager.getCategoriasDadosDeBaja();
            this.showCategorias(categorias, categoriasInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaCategoria() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaCategoria() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> darAltaBajaCategoria() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> darAltaBajaCategoria() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    private void showCategorias(List<Categoria> categorias, List<Categoria> categoriasInactivos, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Lista de Categorias</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 80%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Anadir Nueva Categoria' onclick='$.fn.addCategoria()'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 80%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='40%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(Categoria c : categorias){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+c.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+c.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Editar' onclick='$.fn.editar("+c.getIdCategoria()+",\""+c.getNombre()+"\",\""+c.getSigla()+"\")' class='botonRep' title='Pulsa aqui para editar categoria'/>");
            out.println("        <input type='button' value='Dar Baja' onClick='$.fn.darBaja("+c.getIdCategoria()+",\""+c.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de baja la categoria'/>");
            out.println("        <input type='button' value='Eliminar' onClick='$.fn.eliminar("+c.getIdCategoria()+",\""+c.getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar la categoria'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='4' style='text-align:center'><p style='color:red'>No existen Categorias registrados!<p></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        
        out.println("<!-- boton que muestra y oculta los paises dedos de baja -->");
        out.println("<table class='miReporte' style='width: 80%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar categorias dados de baja'/></td>");
        out.println("    </tr>");
        out.println("</table>      <br/><br/>");
        
        // =========================== PAISES DADOS DE BAJA ============================
        out.println("<div id='categoriasBaja' style='display:none'>");
        
        out.println("<h2 class='decorado'>Lista de Categorias dados de Baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 80%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='40%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>ACCION</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(Categoria c : categoriasInactivos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+c.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+c.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("       <input type='button' value='Dar Alta' onClick='$.fn.darAlta("+c.getIdCategoria()+",\""+c.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de alta la categoria "+c.getNombre()+"'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='4' style='text-align:center'><p style='color:red'>No existen Cargos dados de BAJA!<p></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        out.println("</div>");
    }
    
    public void listarProvincias()throws DataException{
        // accion = 26 = lista provincias
        Connection c = null;
        try{
            c = Conector.getConexion();
            PaisManager pmanager = ManagerFactory.getPaisManagerInstance(c);
            CiudadManager ciumanager = ManagerFactory.getCiudadManagerInstance(c);
            ProvinciaManager prmanager = ManagerFactory.getProvinciaManagerInstance(c);
            Pais pDefault = pmanager.getPaisDefault();
            request.setAttribute("pDefault", pDefault);
            List<Provincia> privinciasPorPais = prmanager.getProvinciasPorPais(pDefault.getIdPais());
            List<Provincia> privinciasPorPaisInactivos = prmanager.getProvinciasPorPaisInactivos(pDefault.getIdPais());
            request.setAttribute("privinciasPorPais", privinciasPorPais);
            request.setAttribute("privinciasPorPaisInactivos", privinciasPorPaisInactivos);
            request.setAttribute("ciudadesPorPais", ciumanager.getCiudadesPorPaisBasic(pDefault.getIdPais()));
            request.setAttribute("paises", pmanager.getPaises());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/AdminProvincia/provincias.jsp?idMenu=1&idSubMenu=2&idOpcion=5";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarCiudades() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarCiudades() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarCiudades() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarCiudades() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditProvincia(int accion)throws DataException{
        // accion = 27 = registra una ciudad, accion = 28 = modifica una ciudad
        PAGE = "";
        Connection c = null;
        int idPais = Integer.parseInt(request.getParameter("idPais"));
        int idCiudad = Integer.parseInt(request.getParameter("idCiudad"));
        int idProvincia = Integer.parseInt(request.getParameter("idProvincia"));
        String nombre = request.getParameter("nombre");
        String sigla = request.getParameter("sigla");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            PaisManager pamanager = ManagerFactory.getPaisManagerInstance(c);
            CiudadManager cmanager = ManagerFactory.getCiudadManagerInstance(c);
            ProvinciaManager prmanager = ManagerFactory.getProvinciaManagerInstance(c);
            Provincia pr = new Provincia();
            pr.setIdPais(idPais);
            pr.setIdCiudad(idCiudad);
            pr.setNombre(nombre);
            pr.setSigla(sigla);
            if(accion == 27){
                idProvincia = prmanager.getIdProvincia(idPais, idCiudad);
                pr.setIdProvincia(idProvincia);
                pr.setActivo(true);
                prmanager.saveProvincia(pr);
                msg = "<p style='text-align:center;color:blue'>La provincia ''"+nombre.toUpperCase()+"'' se registro correctamente!</p>";
            }else{
                idProvincia = Integer.parseInt(request.getParameter("idProvincia"));
                pr.setIdProvincia(idProvincia);
                prmanager.updateProvincia(pr);
                msg = "<p style='text-align:center;color:blue'>La provincia ''"+nombre.toUpperCase()+"'' se modifico correctamente!</p>";
            }
            List<Provincia> provinciasPorPais = prmanager.getProvinciasPorPais(idPais);
            List<Provincia> provinciasPorPaisInactivos = prmanager.getProvinciasPorPaisInactivos(idPais);
            List<Ciudad> ciudadesPorPais = cmanager.getCiudadesPorPaisBasic(idPais);
            Pais p = pamanager.getPais(idPais);
            this.showProvincias(provinciasPorPais, provinciasPorPaisInactivos, p, ciudadesPorPais, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditProvincia() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditProvincia() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Erron! en Administracion -> newEditProvincia() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> newEditProvincia() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void deleteProvincia()throws DataException{
        // accion = 29 = elimina una provincia
        PAGE = "";
        Connection c = null;
        int idPais = Integer.parseInt(request.getParameter("idPais"));
        int idCiudad = Integer.parseInt(request.getParameter("idCiudad"));
        int idProvincia = Integer.parseInt(request.getParameter("idProvincia"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            PaisManager pamanager = ManagerFactory.getPaisManagerInstance(c);
            CiudadManager cmanager = ManagerFactory.getCiudadManagerInstance(c);
            ProvinciaManager prmanager = ManagerFactory.getProvinciaManagerInstance(c);
            if(!prmanager.isUseInDetalleEst(idPais, idCiudad, idProvincia)){ // si no es usado recien se elimina
                prmanager.deleteProvincia(idPais, idCiudad, idProvincia);
                msg = "<p style='text-align:center;color:blue'>La provincia ''"+nombre.toUpperCase()+"'' se eliminaron correctamente!</p>";
            }else{
                msg = "<p style='text-align:center;color:red'>No se puede eliminar la provincia ''"+nombre.toUpperCase()+"'', ¡esta ciendo usado!. Se sugiere dar de baja!</p>";
            }
            List<Provincia> provinciasPorPais = prmanager.getProvinciasPorPais(idPais);
            List<Provincia> provinciasPorPaisInactivos = prmanager.getProvinciasPorPaisInactivos(idPais);
            List<Ciudad> ciudadesPorPais = cmanager.getCiudadesPorPaisBasic(idPais);
            Pais p = pamanager.getPais(idPais);
            this.showProvincias(provinciasPorPais, provinciasPorPaisInactivos, p, ciudadesPorPais, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteProvincia() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteProvincia() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteProvincia() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteProvincia() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void darAltaBajaProvincia(int accion)throws DataException{
        // accion = 30 = dar de baja una ciudad, accion = 31 = dar alta una provincia
        PAGE = "";
        Connection c = null;
        int idPais = Integer.parseInt(request.getParameter("idPais"));
        int idCiudad = Integer.parseInt(request.getParameter("idCiudad"));
        int idProvincia = Integer.parseInt(request.getParameter("idProvincia"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            PaisManager pamanager = ManagerFactory.getPaisManagerInstance(c);
            CiudadManager cmanager = ManagerFactory.getCiudadManagerInstance(c);
            ProvinciaManager prmanager = ManagerFactory.getProvinciaManagerInstance(c);
            if(accion == 30){
                prmanager.darBaja(idPais, idCiudad, idProvincia);
                msg = "<p style='text-align:center;color:blue'>La provincia ''"+nombre.toUpperCase()+"'' se dio de BAJA correctamente!</p>";
            }else{
                prmanager.darAlta(idPais, idCiudad, idProvincia);
                msg = "<p style='text-align:center;color:blue'>La provincia ''"+nombre.toUpperCase()+"'' se dio de ALTA correctamente!</p>";
            }
            List<Provincia> provinciasPorPais = prmanager.getProvinciasPorPais(idPais);
            List<Provincia> provinciasPorPaisInactivos = prmanager.getProvinciasPorPaisInactivos(idPais);
            List<Ciudad> ciudadesPorPais = cmanager.getCiudadesPorPaisBasic(idPais);
            Pais p = pamanager.getPais(idPais);
            this.showProvincias(provinciasPorPais, provinciasPorPaisInactivos, p, ciudadesPorPais, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> darAltaBajaProvincia() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> darAltaBajaProvincia() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> darAltaBajaProvincia() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en! Administracion -> darAltaBajadarAltaBajaProvinciaCiudad() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void changePaisForProvinc()throws DataException{
        // accion = 32 = muestra las ciudades de un pais
        PAGE = "";
        Connection c = null;
        int idPais = Integer.parseInt(request.getParameter("idPais"));
        try{
            c = Conector.getConexion();
            PaisManager pamanager = ManagerFactory.getPaisManagerInstance(c);
            CiudadManager cmanager = ManagerFactory.getCiudadManagerInstance(c);
            ProvinciaManager prmanager = ManagerFactory.getProvinciaManagerInstance(c);
            
            List<Provincia> provinciasPorPais = prmanager.getProvinciasPorPais(idPais);
            List<Provincia> provinciasPorPaisInactivos = prmanager.getProvinciasPorPaisInactivos(idPais);
            List<Ciudad> ciudadesPorPais = cmanager.getCiudadesPorPaisBasic(idPais);
            Pais p = pamanager.getPais(idPais);
            this.showProvincias(provinciasPorPais, provinciasPorPaisInactivos, p, ciudadesPorPais, msg);
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> changePaisForProvinc() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> changePaisForProvinc() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> changePaisForProvinc() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> changePaisForProvinc() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    private void showProvincias(List<Provincia> provinciasPorPais, List<Provincia> provinciasPorPaisInactivos, Pais p, List<Ciudad> ciudadesPorPais, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Lista de Provincias de ''"+p.getNombre()+"''</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Anadir Nueva Ciudad' onclick='$.fn.addProvincia("+p.getIdPais()+",\""+p.getNombre()+"\")'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>CIUDAD</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>ACCION</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(Provincia pr : provinciasPorPais){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+pr.getCiudad().getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+pr.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+pr.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Editar' onclick='$.fn.editar("+pr.getIdPais()+","+pr.getIdCiudad()+","+pr.getIdProvincia()+",\""+pr.getNombre()+"\",\""+pr.getSigla()+"\",\""+pr.getCiudad().getNombre()+"\",\""+p.getNombre()+"\")' class='botonRep' title='Pulsa aqui para editar la provincia'/>");
            out.println("        <input type='button' value='Dar Baja' onClick='$.fn.darBaja("+pr.getIdPais()+","+pr.getIdCiudad()+","+pr.getIdProvincia()+",\""+pr.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de baja la provincia'/>");
            out.println("        <input type='button' value='Eliminar' onClick='$.fn.eliminar("+pr.getIdPais()+","+pr.getIdCiudad()+","+pr.getIdProvincia()+",\""+pr.getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar la provincia'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='5' style='text-align:center'><p style='color:red'>No existen provincias registrados para ''"+p.getNombre()+"''!<p></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        
        out.println("<!-- boton que muestra y oculta los paises dedos de baja -->");
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar bajas'/></td>");
        out.println("    </tr>");
        out.println("</table>      <br/><br/>");
        
        // =========================== PAISES DADOS DE BAJA ============================
        out.println("<div id='provinciasBaja' style='display:none'>");
        
        out.println("<h2 class='decorado'>Provincias dados de Baja de ''"+p.getNombre()+"''</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='35%' class='th_decoradoRowspan'>CIUDAD</th>");
        out.println("            <th width='35%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='15%' class='th_decoradoRowspan'>ACCION</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(Provincia pr : provinciasPorPaisInactivos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+pr.getCiudad().getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+pr.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+pr.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("       <input type='button' value='Dar Alta' onClick='$.fn.darAlta("+pr.getIdPais()+","+pr.getIdCiudad()+","+pr.getIdProvincia()+",\""+pr.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de alta la provincia de \""+p.getNombre()+"\"'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='5' style='text-align:center'><p style='color:red'>No existen Provincias dados de BAJA!<p></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        // renovamos las ciudades por pais
        i = 0;
        out.println("<script>");
        out.println(" ciudadesPorPais = new Array();");
        for(Ciudad c : ciudadesPorPais){
            out.println(" ciudadesPorPais["+i+"] = new Array("+c.getIdPais()+","+c.getIdCiudad()+",'"+c.getNombre()+"')");
            i++;
        }                
        out.println("</script>");
    }
    
    private void indexAdminAcademico() {
        PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminAcademico/index.jsp";
    }
    
    public void listarFacultades()throws DataException{
        // accion = 40 = lista facultades
        Connection c = null;
        try{
            c = Conector.getConexion();
            DepartamentoManager dmanager = ManagerFactory.getDepartamentoManagerInstance(c);
            FacultadManager fmanager = ManagerFactory.getFacultadManagerInstance(c);
            request.setAttribute("dptos", dmanager.getDeptos());
            request.setAttribute("facultades", fmanager.getFacultades());
            request.setAttribute("facultadesInactivos", fmanager.getFacultadesInactivos());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminAcademico/Facultad/facultades.jsp?idMenu=1&idSubMenu=3&idOpcion=1";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarFacultades() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> listarFacultades() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarFacultades() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> listarFacultades() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditFacultad(int accion)throws DataException{
        // accion = 41 = registra una facultad, accion = 42 = actualiza datos de facultad
        PAGE = "";
        Connection c = null;
        int idFacultad = 0;
        String nombre = request.getParameter("nombre").trim();
        String sigla = request.getParameter("sigla").trim();
        String telefono = request.getParameter("telefono").trim();
        String direccion = request.getParameter("direccion").trim();
        int idDepartamento = Integer.parseInt(request.getParameter("idDepartamento").trim());
        System.out.println("idDepartamento = "+idDepartamento);
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            FacultadManager fmanager = ManagerFactory.getFacultadManagerInstance(c);
            Facultad f = new Facultad();
            f.setNombre(nombre);
            f.setSigla(sigla);
            f.setTelefono(telefono);
            f.setDireccion(direccion);
            f.setIdDepartamento(idDepartamento);
            if(accion == 41){
                idFacultad = fmanager.getIdFacultad();
                f.setIdFacultad(idFacultad);
                f.setActivo(true);
                fmanager.saveFacultad(f);
                msg = "<p style='text-align:center;color:blue'>La facultad ''"+nombre.toUpperCase()+"'' se registro correctamente!</p>";
            }else{
                idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
                f.setIdFacultad(idFacultad);
                fmanager.updateFacultad(f);
                msg = "<p style='text-align:center;color:blue'>La facultad ''"+nombre.toUpperCase()+"'' se modifico correctamente!</p>";
            }
            List<Facultad> facultades = fmanager.getFacultades();
            List<Facultad> facultadesInactivos = fmanager.getFacultadesInactivos();
            this.showFacultades(facultades, facultadesInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditFacultad() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditFacultad() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditFacultad() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditFacultad() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void deleteFacultad()throws DataException{
        // accion = 43 = elimina una facultad
        PAGE = "";
        Connection c = null;
        int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            FacultadManager fmanager = ManagerFactory.getFacultadManagerInstance(c);
            if(!fmanager.isUseFacultadForDelete(idFacultad)){ // si no es usado recien se elimina
                fmanager.deleteFacultad(idFacultad);
                msg = "<p style='text-align:center;color:blue'>La unidad educativa ''"+nombre.toUpperCase()+"'' y sus dependencias de departamento, especialidad y materias, se eliminaron correctamente!</p>";
            }else{
                msg = "<p style='text-align:center;color:red'>No se puede eliminar la unidad educativa ''"+nombre.toUpperCase()+"'', ¡esta ciendo usado!. Se sugiere dar de baja!</p>";
            }
            List<Facultad> facultades = fmanager.getFacultades();
            List<Facultad> facultadesInactivos = fmanager.getFacultadesInactivos();
            this.showFacultades(facultades, facultadesInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> deleteFacultad() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> deleteFacultad() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> deleteFacultad() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> deleteFacultad() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void darAltaBajaFacultad(int accion)throws DataException{
        // accion = 44 = dar baja facultad, accion = 45 = dar alta  facultad
        PAGE = "";
        Connection c = null;
        int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
        String nombre = request.getParameter("nombre");
       
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            FacultadManager fmanager = ManagerFactory.getFacultadManagerInstance(c);
            if(accion == 44){
                fmanager.darBaja(idFacultad);
                msg = "<p style='text-align:center;color:blue'>La unidad educativa ''"+nombre.toUpperCase()+"'' y sus dependencias de departamentos, especialidades y materias. Se dieron de BAJA correctamente!</p>";
            }else{
                fmanager.darAlta(idFacultad);
                msg = "<p style='text-align:center;color:blue'>La unidad educativa ''"+nombre.toUpperCase()+"'' y sus dependencias de departamentos, especialidad y materias. Se dieron de ALTA correctamente!</p>";
            }
            List<Facultad> facultades = fmanager.getFacultades();
            List<Facultad> facultadesInactivos = fmanager.getFacultadesInactivos();
            this.showFacultades(facultades, facultadesInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaFacultad() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaFacultad() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaFacultad() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaFacultad() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    private void showFacultades(List<Facultad> facultades, List<Facultad> facultadesInactivos, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Lista de Unidades Educativas</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Anadir Nueva unidad educativa' onclick='$.fn.addFacultad()'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>CIUDAD</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>TELEFONO</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>DIRECCION</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan' colspan='3'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(Facultad f : facultades){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+f.getDepartamento().getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+f.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+f.getSigla()+"</td>");
            out.println("    <td class='th_decorado'>"+f.getTelefono()+"</td>");
            out.println("    <td class='th_decorado'>"+f.getDireccion()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Editar' onclick='$.fn.editar("+f.getIdFacultad()+",\""+f.getNombre()+"\")' class='botonRep' title='Pulsa aqui para editar la facultad'/>");
            out.println("    </td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Dar Baja' onClick='$.fn.darBaja("+f.getIdFacultad()+",\""+f.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de baja la facultad'/>");
            out.println("    </td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Eliminar' onClick='$.fn.eliminar("+f.getIdFacultad()+",\""+f.getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar la facultad'/>");
            out.println("    </td>");
            out.println("</tr>");
            out.println("<input type='hidden' name='sigla"+f.getIdFacultad()+"' id='sigla"+f.getIdFacultad()+"' value='"+f.getSigla()+"' />");
            out.println("<input type='hidden' name='telefono"+f.getIdFacultad()+"' id='telefono"+f.getIdFacultad()+"' value='"+f.getTelefono()+"' />");
            out.println("<input type='hidden' name='direccion"+f.getIdFacultad()+"' id='direccion"+f.getIdFacultad()+"' value='"+f.getDireccion()+"' />");
            out.println("<input type='hidden' name='idDepartamento"+f.getIdFacultad()+" id='idDepartamento"+f.getIdFacultad()+"' value='"+f.getIdDepartamento()+"' />");
            out.println("<input type='hidden' name='nombreDepto"+f.getIdFacultad()+" id='nombreDepto"+f.getIdFacultad()+"' value='"+f.getDepartamento().getNombre()+"' />");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='9' style='text-align:center'><p style='color:red'>No existen Facultades registrados!<p></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        
        out.println("<!-- boton que muestra y oculta los facultades dedos de baja -->");
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar bajas'/></td>");
        out.println("    </tr>");
        out.println("</table>      <br/><br/>");
        
        // =========================== FACULTADES DADOS DE BAJA ============================
        out.println("<div id='facultadesBaja' style='display:none'>");
        
        out.println("<h2 class='decorado'>Lista de Unidades Educativas dados de Baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>CIUDAD</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>TELEFONO</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>DIRECCION</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(Facultad f : facultadesInactivos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+f.getDepartamento().getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+f.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+f.getSigla()+"</td>");
            out.println("    <td class='th_decorado'>"+f.getTelefono()+"</td>");
            out.println("    <td class='th_decorado'>"+f.getDireccion()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("       <input type='button' value='Dar Alta' onClick='$.fn.darAlta("+f.getIdFacultad()+",\""+f.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de alta la facultad \""+f.getNombre()+"\"'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='7' style='text-align:center'><span style='color:red'>No existen Facultades dados de BAJA!</span></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        out.println("</div> <!-- end id='facultadesBaja' -->");
    }
    
    public void listarDeptos()throws DataException{
        // accion = 46 = lista de departamentos
        Connection c = null;
        try{
            c = Conector.getConexion();
            DepartamentoManager dmanager = ManagerFactory.getDepartamentoManagerInstance(c);
            request.setAttribute("deptos", dmanager.getDeptos());
            request.setAttribute("deptosInactivos", dmanager.getDeptosInactivos());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/AdminDepto/deptos.jsp?idMenu=1&idSubMenu=2&idOpcion=8";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarDeptos() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> listarDeptos() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarDeptos() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> listarDeptos() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditDepto(int accion)throws DataException{
        // accion = 47 = registra un departamento, accion = 48 = actualiza datos de departamento
        PAGE = "";
        Connection c = null;
        int idDepartamento = 0;
        String nombre = request.getParameter("nombre").trim();
        String sigla = request.getParameter("sigla").trim();
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            DepartamentoManager dmanager = ManagerFactory.getDepartamentoManagerInstance(c);
            Departamento d = new Departamento();
            d.setNombre(nombre);
            d.setSigla(sigla);
            if(accion == 47){
                idDepartamento = dmanager.getIdDepto();
                d.setIdDepartamento(idDepartamento);
                d.setActivo(true);
                dmanager.saveDepto(d);
                msg = "<p style='text-align:center;color:blue'>El departamento ''"+nombre.toUpperCase()+"'' se registro correctamente!</p>";
            }else{
                idDepartamento = Integer.parseInt(request.getParameter("idDepartamento"));
                d.setIdDepartamento(idDepartamento);
                dmanager.updateDepto(d);
                msg = "<p style='text-align:center;color:blue'>El departamento ''"+nombre.toUpperCase()+"'' se modifico correctamente!</p>";
            }
            List<Departamento> deptos = dmanager.getDeptos();
            List<Departamento> deptosInactivos = dmanager.getDeptosInactivos();
            this.showDeptos(deptos, deptosInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditDepto() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditDepto() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditDepto() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditDepto() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void deleteDepto()throws DataException{
        // accion = 49 = elimina una facultad
        PAGE = "";
        Connection c = null;
        int idDepartamento = Integer.parseInt(request.getParameter("idDepartamento"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            DepartamentoManager dmanager = ManagerFactory.getDepartamentoManagerInstance(c);
            if(!dmanager.isUseDeptoForDelete(idDepartamento)){ // si no es usado recien se elimina
                dmanager.deleteDepto(idDepartamento);
                msg = "<p style='text-align:center;color:blue'>El depto. ''"+nombre.toUpperCase()+"'' se eliminaron correctamente!</p>";
            }else{
                msg = "<p style='text-align:center;color:red'>No se puede eliminar el depto. ''"+nombre.toUpperCase()+"'', ¡esta ciendo usado!. Se sugiere dar de baja!</p>";
            }
            List<Departamento> deptos = dmanager.getDeptos();
            List<Departamento> deptosInactivos = dmanager.getDeptosInactivos();
            this.showDeptos(deptos, deptosInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> deleteDepto() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> deleteDepto() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> deleteDepto() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> deleteDepto() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    private void indexRecursosHumanos() throws DataException{// accion <-- 50
        PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/recursosHumanos/index.jsp";
    }

    private void listarDocentes() throws DataException{
        // accion = 51 = ir a listar docentes
        Connection c = null;
        try{
            c = Conector.getConexion();
            RolUsuarioManager ruManager = ManagerFactory.getRolUsuarioManagerInstance(c);
            request.setAttribute("RolUsuarioDocActivos", ruManager.getDocentesActivos());    // enviamos listas de RolUsuario[rol,pais,ciudad,categoria,detalleDoc]
            request.setAttribute("RolUsuarioDocInactivos", ruManager.getDocentesInactivos());// enviamos listas de RolUsuario[rol,pais,ciudad,categoria,detalleDoc]
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/recursosHumanos/docente/docente.jsp?idMenu=1&idSubMenu=1&idOpcion=2";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarDocentes() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarDocentes() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarDocentes() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarDocentes() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }

    private void formNewEditDocente(int accion) throws DataException{// accion <-- 52 nuevo; 54 <-- editar
        Connection c = null;
        int idUsuario = 0;
        int idRol = 0;
        if(accion == 54){// editar
            idUsuario = Integer.parseInt(request.getParameter("idUsuario"));
            idRol = Integer.parseInt(request.getParameter("idRol"));
        }
        try{
            c = Conector.getConexion();
            PaisManager pManager = ManagerFactory.getPaisManagerInstance(c);
            CiudadManager cManager = ManagerFactory.getCiudadManagerInstance(c);
            CategoriaManager caManager = ManagerFactory.getCategoriaManagerInstance(c);
            
            request.setAttribute("paises", pManager.getPaises());
            request.setAttribute("ciudades", cManager.getCiudadesActivos());
            request.setAttribute("categorias", caManager.getCategorias());
            
            if(accion == 54){// editando
                RolUsuarioManager ruManager = ManagerFactory.getRolUsuarioManagerInstance(c);
                request.setAttribute("rolUsuario", ruManager.getRolUsuario(idUsuario, idRol));
            }
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/recursosHumanos/docente/formDocente.jsp?idMenu=1&idSubMenu=1&idOpcion=2";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formNewEditDocente() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formNewEditDocente() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formNewEditDocente() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formNewEditDocente() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }

    private void newEditDocente(int accion) throws DataException, IOException{// accion <-- 53 nuevo ; 55 <-- update docente
        PAGE = "";
        PrintWriter out = response.getWriter();
        int idUsuario = 0;
        if(accion == 55){
            idUsuario = Integer.parseInt(request.getParameter("idUsuario"));
        }
        String nombre = request.getParameter("nombre");
        String apellido = request.getParameter("apellidos");
        String ci = request.getParameter("ci");
        String expedidoEn = request.getParameter("expedidoEn");
        char genero = request.getParameter("genero").charAt(0);
        String telefono = request.getParameter("telefono");
        String email = request.getParameter("email");
        String direccion = request.getParameter("direccion");
        String fechaNac = request.getParameter("year")+"/"+request.getParameter("mes")+"/"+request.getParameter("dia");
        String login = request.getParameter("cuenta");
        String password = request.getParameter("1psw");
        
        int idDetalleDocente = 0;
        int idPais = Integer.parseInt(request.getParameter("pais"));
        int idCiudad = Integer.parseInt(request.getParameter("ciudad"));
        String localidad = request.getParameter("localidad");
        int idCategoria = Integer.parseInt(request.getParameter("categoria"));
        
        
        Connection c = null;
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            UsuarioManager uManager = ManagerFactory.getUsuarioManagerInstance(c);
            DetalleDocenteManager ddManager = ManagerFactory.getDetalleDocenteManagerInstance(c);
            RolUsuarioManager ruManager = ManagerFactory.getRolUsuarioManagerInstance(c);
            
            Usuario u = new Usuario();
            u.setNombre(nombre);
            u.setApellido(apellido);
            u.setCi(ci);
            u.setExpedidoEn(expedidoEn);
            u.setGenero(genero);
            u.setTelefono(telefono);
            u.setEmail(email);
            u.setDireccion(direccion);
            u.setFechaNac(fechaNac);
            u.setFoto("NO TIENE");
            u.setLogin(login);
            u.setPassword(password);
            
            DetalleDocente dd = new DetalleDocente();
            dd.setIdPais(idPais);
            dd.setIdCiudad(idCiudad);
            dd.setLocalidad(localidad);
            dd.setIdCategoria(idCategoria);
            
            RolUsuario ru = new RolUsuario();
            ru.setIdRol(2);
            ru.setActivo(true);
            if(accion == 53){// nuevo
                idUsuario = uManager.getIdUsuario();
                u.setIdUsuario(idUsuario);
                uManager.saveUsuario(u);
                
                dd.setIdDetalleDocente(idUsuario);
                ddManager.saveDetalleDocente(dd);
                
                ru.setIdUsuario(idUsuario);
                ruManager.saveRolUsuario(ru);
                msg = "El docente se registro correctamente. <i>Verifique los datos!</i>";
            }else{ // para editar docente 55
                // ***************************
                u.setIdUsuario(idUsuario);
                uManager.updateUsuario(u);
                
                dd.setIdDetalleDocente(idUsuario);
                ddManager.updateDetalleDocente(dd);
                
                //rol_usuario ya no porq no hay nada
                msg = "El docente se modifico correctamente. <i>Verifique los datos!</i>";
            }
            // construimos el html de respuesta
            
            out.println("<center>");
            out.println("<fieldset style='display: block;border: 1px solid #297a9f;border-radius: 8px;width: 50%;padding: 10px 10px 6px;margin-top: 10px;background-color: white;box-shadow: 0px 5px 10px #70b8d6, 0 0 0 5px #278cba inset;position: relative;'>");//
            out.println("<div style='clear: left; text-align: center;'><h3>"+msg+"</h3></div>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>Nombre :</label>");
            out.println("    <label style='float:left; margin-left:0.2em;'><b>"+u.getNombre().toUpperCase()+"</b></label>");
            out.println("</div><br/>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>Apellido :</label>");
            out.println("    <label style='float:left; margin-left:0.2em;'><b>"+u.getApellido().toUpperCase()+"</b></label>");
            out.println("</div><br/>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>C.I. :</label>");
            out.println("    <label style='float:left; margin-left:0.2em;'><b>"+u.getCi()+" "+u.getExpedidoEn()+"</b></label>");
            out.println("</div><br/><br/>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>&nbsp;</label>");
            out.println("    <table border='0' style='float: left'>");
            out.println("        <tr>");
            out.println("            <td style='text-align:right'><br/><input type='button' value='Ver lista de docentes' onClick='listarDocentes()' class='boton' id='botonSub' title='Pulse aqu&iacute; para Ingresar'/>&nbsp;&nbsp;</td>");
            out.println("            <td><br/>&nbsp;&nbsp;"+((accion==53)?"<input type='button' name='addDocente' value='A&nacute;adir Docentes' onClick='addDocentes()' class='boton' title='Pulse aqu&iacute; para a&nacute;adir docentes.'/>":"")+"</td>");
            out.println("        </tr>");
            out.println("    </table>");
            out.println("</div>");
            out.println("</center>");
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditDocente() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditDocente() DataException "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditDocente() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditDocente() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
            out.close();
        }
    }
    
    private void darAltaBajaDocente(int accion) throws DataException{// accion <-- 56 baja ; 57 alta
        PAGE = "";
        Connection c = null;
        int idUsuario = Integer.parseInt(request.getParameter("idUsuario"));
        int idRol = Integer.parseInt(request.getParameter("idRol"));
        String nombre = request.getParameter("nombre");
        
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            RolUsuarioManager ruManager = ManagerFactory.getRolUsuarioManagerInstance(c);
            
            if(accion == 56){// damos baja
                ruManager.darBajaRolUsuario(idUsuario, idRol);
                msg = "<p style='text-align:center;color:blue'>El docente ''"+nombre.toUpperCase()+"'' se di&oacute; de BAJA correctamente!</p>";
            }else{// 57 damos alta
                ruManager.darAltaRolUsuario(idUsuario, idRol);
                msg = "<p style='text-align:center;color:blue'>El docente ''"+nombre.toUpperCase()+"'' se di&oacute; de ALTA correctamente!</p>";
            }
            this.showDocentes(ruManager.getDocentesActivos(), ruManager.getDocentesInactivos(), msg);// enviando listar <RolUsuario>
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaDocente(accion) DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaDocente(accion) DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> darAltaBajaDocente(accion) ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> darAltaBajaDocente(accion) Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }

    private void showDocentes(List<RolUsuario> docentesActivos, List<RolUsuario> docentesInactivos, String msg) throws IOException{// accion <-- 56; XX
        PrintWriter out = response.getWriter();
        
        out.println("<h2 class='decorado'>Lista de Docentes</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("   <tr>");
        out.println("       <td style='text-align: right'><input type='button' class='boton' value='Anadir Nuevo Docente' onclick='nuevo()' title='Pulsa aqui para nuevo docente.'/></td>");
        out.println("   </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='3%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='19%' class='th_decoradoRowspan'>APELLIDO</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='9%' class='th_decoradoRowspan'>CI.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>TEL&Eacute;FONO</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>FECHA NAC.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>LOGIN</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>EMAIL</th>");
        out.println("            <th width='16%' class='th_decoradoRowspan' colspan='3'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(RolUsuario ru : docentesActivos){
            Usuario u = ru.getUsuario();
            Rol r = ru.getRol();
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+u.getApellido()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getCi()+" "+u.getExpedidoEn()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getTelefono()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getFechaNac()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getLogin()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getEmail()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'><input type='button' value='Editar' onclick='editar("+u.getIdUsuario()+","+r.getIdRol()+")' class='botonRep' title='Pulsa aqu&iacute; para editar docente.'/></td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'><input type='button' value='Dar Baja' onClick='darBaja("+u.getIdUsuario()+","+r.getIdRol()+",\""+u.getNombre()+" "+u.getApellido()+"\")' class='botonRep' title='Pulsa aqu&iacute; para dar de baja al docente.'/></td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'><input type='button' value='Eliminar' onClick='eliminar("+u.getIdUsuario()+",\""+u.getNombre()+" "+u.getApellido()+"\")' class='botonRep' title='Pulsa aqu&iacute; para eliminar al docente.'/></td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.println("<tr class='tr_decorado'>");
            out.println("     <td class='td_decorado' colspan='11' style='text-align:center'><span style='color:red'>No existen Docentes registrados!<span></td>");
            out.println("</tr>");
        }
        out.println("    </tbody>");
        out.println("</table>");
        out.println("<!-- boton que muestra y oculta los docentes dados de baja -->");
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar docentes dados de baja'/></td>");
        out.println("    </tr>");
        out.println("</table><br/><br/>");
        // =========================== DOCENTES DADOS DE BAJA ============================
        out.println("<div id='docentesBaja' style='display:none'>");
        out.println("<h2 class='decorado'>Docentes dados de Baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='3%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='19%' class='th_decoradoRowspan'>APELLIDO</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='9%' class='th_decoradoRowspan'>CI.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>TEL&Eacute;FONO</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>FECHA NAC.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>LOGIN</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>EMAIL</th>");
        out.println("            <th width='16%' class='th_decoradoRowspan'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(RolUsuario ru : docentesInactivos){
            Usuario u = ru.getUsuario();
            Rol r = ru.getRol();
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+u.getApellido()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getCi()+" "+u.getExpedidoEn()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getTelefono()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getFechaNac()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getLogin()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getEmail()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'><input type='button' value='Dar Alta' onClick='darAlta("+u.getIdUsuario()+","+r.getIdRol()+",\""+u.getNombre()+" "+u.getApellido()+"\")' class='botonRep' title='Pulsa aqui para dar de alta al Docente "+u.getNombre()+"'/></td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='9' style='text-align:center'><span style='color:red'>No existen Docentes dados de baja!</span></td>");
            out.write("</tr>");
        }
        out.println("    </tbody>");
        out.println("</table>");
        out.println("</div>");
        out.close();
    }

    private void deleteDocente() throws DataException{// accion <-- 58
        
        PAGE = "";
        Connection c = null;
        int idUsuario = Integer.parseInt(request.getParameter("idUsuario"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            UsuarioManager uManager = ManagerFactory.getUsuarioManagerInstance(c);
            RolUsuarioManager ruManager = ManagerFactory.getRolUsuarioManagerInstance(c);
            
            if( !uManager.existeDocente(idUsuario) ){ // si no es usado recien se elimina
                uManager.deleteDocente(idUsuario);
                msg = "<span style='text-align:center;color:blue'>El Docente ''"+nombre.toUpperCase()+"'' y sus dependencias, se eliminaron correctamente!</span>";
            }else{
                msg = "<span style='text-align:center;color:red'>No se puede eliminar al docente ''"+nombre.toUpperCase()+"'', <i>¡esta siendo usado!. Se sugiere dar de baja!</i></span>";
            }
            this.showDocentes(ruManager.getDocentesActivos(), ruManager.getDocentesInactivos(), msg);// enviando listar <RolUsuario>
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteDocente() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteDocente() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteDocente() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteDocente() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }

    private void listarEstudiantes() throws DataException{// accion <-- 59
        Connection c = null;
        try{
            c = Conector.getConexion();
            EstudianteManager eManager = ManagerFactory.getEstudianteManagerInstance(c);
            
            request.setAttribute("estudiantesActivos", eManager.getEstudiantesActivos());    // enviamos listas de <Estudiante>[detalleEstudiante_ac,detalleEstudiante_nac]
            request.setAttribute("estudiantesInactivos", eManager.getEstudiantesInactivos());// enviamos listas de <Estudiante>[detalleEstudiante_ac,detalleEstudiante_nac]
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/recursosHumanos/estudiante/estudiante.jsp?idMenu=1&idSubMenu=1&idOpcion=3";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarEstudiantes() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarEstudiantes() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarEstudiantes() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarEstudiantes() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }

    private void formNewEditEstudiante(int accion) throws DataException{ // accion <-- 60 form nuevo;62 <-- form edit
        Connection c = null;
        int idEstudiante = 0;
        if(accion == 62){// para editar 
            idEstudiante = Integer.parseInt(request.getParameter("idEstudiante"));
        }
        try{
            c = Conector.getConexion();
            PaisManager pManager = ManagerFactory.getPaisManagerInstance(c);
            CiudadManager cManager = ManagerFactory.getCiudadManagerInstance(c);
            ProvinciaManager pvManager = ManagerFactory.getProvinciaManagerInstance(c);
            DepartamentoManager dManager = ManagerFactory.getDepartamentoManagerInstance(c);
            FacultadManager fManager = ManagerFactory.getFacultadManagerInstance(c);
            CarreraManager caManager = ManagerFactory.getCarreraManagerInstance(c);
            
            request.setAttribute("paises", pManager.getPaises());
            request.setAttribute("ciudades", cManager.getCiudadesActivos());
            request.setAttribute("provincias", pvManager.getProvinciasActivos());
            request.setAttribute("deptos", dManager.getDeptos());
            request.setAttribute("facultades", fManager.getFacultades());
            request.setAttribute("carrerasAll", caManager.getCarrerasAll());
            
            
            if(accion == 62){// editando 
                EstudianteManager eManager = ManagerFactory.getEstudianteManagerInstance(c);
                request.setAttribute("estudiante", eManager.getEstudiante(idEstudiante));
            }
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/recursosHumanos/estudiante/formEstudiante.jsp?idMenu=1&idSubMenu=1&idOpcion=3";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formNewEditEstudiante() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formNewEditEstudiante() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formNewEditEstudiante() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formNewEditEstudiante() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }

    private void newEditEstudiante(int accion) throws DataException, IOException{// accion <-- 61 para insertar Estudiante;63<-- update
        PrintWriter out = response.getWriter();
        PAGE = "";
        int idEstudiante = 0;
        if(accion == 63){// update
            idEstudiante = Integer.parseInt(request.getParameter("idEstudiante"));
        }
        boolean isNew = Boolean.parseBoolean(request.getParameter("isNew"));
        
        String nombre = request.getParameter("nombre");
        String apellidoPa = request.getParameter("apellidoPa");
        String apellidoMa = request.getParameter("apellidoMa");
        String ci = request.getParameter("ci");
        String password = request.getParameter("pswci");
        String expedidoEn = request.getParameter("expedidoEn");
        char genero = request.getParameter("genero").charAt(0);
        String telefono = request.getParameter("telefono");
        String email = request.getParameter("email");
        String direccion = request.getParameter("direccion");
        String fechaNac = request.getParameter("year")+"/"+request.getParameter("mes")+"/"+request.getParameter("dia");
        
        Estudiante es = new Estudiante();
        es.setNombre(nombre);
        es.setApellidoPa(apellidoPa);
        es.setApellidoMa(apellidoMa);
        es.setCi(ci);
        es.setPassword(password);
        es.setExpedidoEn(expedidoEn);
        es.setGenero(genero);
        es.setTelefono(telefono);
        es.setEmail(email);
        es.setDireccion(direccion);
        es.setFechaNac(fechaNac);
        es.setFoto("NO TIENE");
        es.setEstado(1);//0<--inactivo; 1<--activo; 2<-- con titulo, etc
        
        // ACTIVO Y FOTO DIRECTO AL SETEAR LOS OBJETOS
        int idPaisActual = Integer.parseInt(request.getParameter("paisAc"));
        int idCiudadActual = Integer.parseInt(request.getParameter("ciudadAc"));
        int idProvinciaActual = Integer.parseInt(request.getParameter("provinciaAc"));//provinciaAc
        String localidadActual = request.getParameter("localidadAc");
        String cantonActual = request.getParameter("cantonAc");
        int idPaisNac = Integer.parseInt(request.getParameter("paisNac"));
        int idCiudadNac = Integer.parseInt(request.getParameter("ciudadNac"));
        int idProvinciaNac = Integer.parseInt(request.getParameter("provinciaNac"));
        String localidadNac = request.getParameter("localidadNac");
        String cantonNac = request.getParameter("cantonNac");
        
        DetalleEstudiante de = new DetalleEstudiante();
        de.setIdPaisActual(idPaisActual);
        de.setIdCiudadActual(idCiudadActual);
        de.setIdProvinciaActual(idProvinciaActual);
        de.setLocalidadActual(localidadActual);
        de.setCantonActual(cantonActual);
        de.setIdPaisNac(idPaisNac);
        de.setIdCiudadNac(idCiudadNac);
        de.setIdProvinciaNac(idProvinciaNac);
        de.setLocalidadNac(localidadNac);
        de.setCantonNac(cantonNac);
        
        String periodoAux = UtilDate.getFechaSqlActual();
        int periodo = Integer.parseInt(periodoAux.substring(0,4));
        
        // para carrera_estudiante
        CarreraEstudiante ce = new CarreraEstudiante();
        int idCarrera = Integer.parseInt(request.getParameter("carrera"));
        ce.setIdCarrera(idCarrera);
        ce.setFecha( UtilDate.getFechaSqlActual() );
        ce.setEstado(1);
        
        
        Connection c = null;
        c = Conector.getConexion();
        BloqueoManager bManager = ManagerFactory.getBloqueoManagerInstance(c);
        EstudianteManager eManager = ManagerFactory.getEstudianteManagerInstance(c);
        DetalleEstudianteManager deManager = ManagerFactory.getDetalleEstudianteManagerInstance(c);
        IdentificadorManager iManager = ManagerFactory.getIdentificadorManagerInstance(c);
        CarreraEstudianteManager ceManager = ManagerFactory.getCarreraEstudianteManagerInstance(c);
        try{
            
            c.setAutoCommit(false);
            if(isNew){// solo bloqueo cuando asigno un nuevo cod-sis
                String bloqueoTablas = "LOCK TABLES";
                bloqueoTablas += " DETALLE_ESTUDIANTE WRITE";
                bloqueoTablas += ", ESTUDIANTE WRITE";
                bloqueoTablas += ", CARRERA_ESTUDIANTE WRITE";
                bloqueoTablas += ", IDENTIFICADOR WRITE";
                bManager.bloquearTablas(bloqueoTablas);
            }
            
            if(accion == 61){// nuevo
                
                Identificador i = iManager.getIdentificador(periodo);
                idEstudiante = i.getCodSis();
                es.setIdEstudiante(idEstudiante);
                eManager.saveEstudiante(es);
                
                de.setIdDetalleEstudiante(idEstudiante);
                deManager.saveDetalleEstudiante(de);
                
                ce.setIdEstudiante(es.getIdEstudiante());
                ceManager.saveCarreraEstudiante(ce);
                
                msg = "El estudiante se registro correctamente. <i>Verifique los datos!</i>";
            }else{ // para editar docente 63
                es.setIdEstudiante(idEstudiante);
                eManager.updateEstudiante(es);
                
                de.setIdDetalleEstudiante(idEstudiante);
                deManager.updateDetalleEstudiante(de);
                
                msg = "El estudiante se modifico correctamente. <i>Verifique los datos!</i>";
            }
            // construimos el html de respuesta
            out.println("<center>");
            out.println("<fieldset style='display: block;border: 1px solid #297a9f;border-radius: 8px;width: 50%;padding: 10px 10px 6px;margin-top: 10px;background-color: white;box-shadow: 0px 5px 10px #70b8d6, 0 0 0 5px #278cba inset;position: relative;'>");//
            out.println("<div style='clear: left; text-align: center;'><h3>"+msg+"</h3></div>");
            out.println("<div style='clear: both'><br/>");
            out.println("    <label class='form_align30'>Cod. Sis. :</label>");
            out.println("    <label style='float:left; margin-left:0.2em;'><b>"+idEstudiante+"</b></label>");
            out.println("</div><br/>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>Nombre :</label>");
            out.println("    <label style='float:left; margin-left:0.2em;'><b>"+es.getNombre().toUpperCase()+"</b></label>");
            out.println("</div><br/>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>Apellido :</label>");
            out.println("    <label style='float:left; margin-left:0.2em;'><b>"+es.getApellidoPa().toUpperCase()+" "+es.getApellidoMa().toUpperCase()+"</b></label>");
            out.println("</div><br/>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>C.I. :</label>");
            out.println("    <label style='float:left; margin-left:0.2em;'><b>"+es.getCi()+" "+es.getExpedidoEn()+"</b></label>");
            out.println("</div><br/><br/>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>&nbsp;</label>");
            out.println("    <table border='0' style='float: left'>");
            out.println("        <tr>");
            out.println("            <td style='text-align:right'><br/><input type='button' value='Ver lista de estudiantes' onClick='listarEstudiantes()' class='boton' id='botonSub' title='Pulse aqu&iacute; para Ingresar'/>&nbsp;&nbsp;</td>");
            out.println("            <td><br/>&nbsp;&nbsp;"+((accion==61)?"<input type='button' name='addEstudiantes' value='A&nacute;adir Estudiantes' onClick='addEstudiantes()' class='boton' title='Pulse aqu&iacute; para a&nacute;adir estudiante.'/>":"")+"</td>");
            out.println("        </tr>");
            out.println("    </table>");
            out.println("</div>");
            out.println("</center>");
            idEstudiante++;
            iManager.updateIdentificadorVentaDePasaje(periodo, idEstudiante);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditEstudiante() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditEstudiante() DataException "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditEstudiante() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditEstudiante() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            if(isNew) bManager.desBloquearTablas();
            SqlManager.closeConexion(c);
            out.close();
            
        }
    }

    private void darAltaBajaEstudiante(int accion) throws DataException{// accion<-- 64 darBaja; 65<-- alta
        PAGE = "";
        Connection c = null;
        int idEstudiante = Integer.parseInt(request.getParameter("idEstudiante"));
        String nombre = request.getParameter("nombre");
        
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            EstudianteManager eManager = ManagerFactory.getEstudianteManagerInstance(c);
            
            
            if(accion == 64){// damos baja
                eManager.darBajaEstudiante(idEstudiante);
                msg = "<p style='text-align:center;color:blue'>El estudiante ''"+nombre.toUpperCase()+"'' se di&oacute; de BAJA correctamente!</p>";
            }else{// 65 damos alta
                eManager.darAltaEstudiante(idEstudiante);
                msg = "<p style='text-align:center;color:blue'>El estudiante ''"+nombre.toUpperCase()+"'' se di&oacute; de ALTA correctamente!</p>";
            }
            this.showEstudiantes(eManager.getEstudiantesActivos(), eManager.getEstudiantesInactivos(), msg);// enviando listar <RolUsuario>
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaEstudiante(accion) DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaEstudiante(accion) DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaEstudiante(accion) ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaEstudiante(accion) Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }

    private void showEstudiantes(List<Estudiante> estudiantesActivos, List<Estudiante> estudiantesInactivos, String msg) throws IOException {
        PrintWriter out = response.getWriter();
        
        out.println("<h2 class='decorado'>Lista de Estudiantes</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("   <tr>");
        out.println("       <td style='text-align: right'><input type='button' class='boton' value='Anadir Nuevo Estudiante' onclick='nuevo()'/></td>");
        out.println("   </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='3%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='19%' class='th_decoradoRowspan'>APELLIDO</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='9%' class='th_decoradoRowspan'>CI.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>TEL&Eacute;FONO</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>FECHA NAC.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>GENERO</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>EMAIL</th>");
        out.println("            <th width='16%' class='th_decoradoRowspan' colspan='3'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(Estudiante e : estudiantesActivos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+e.getApellidoPa()+" "+e.getApellidoMa()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getCi()+" "+e.getExpedidoEn()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getTelefono()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getFechaNac()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getGenero()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getEmail()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'><input type='button' value='Editar' onclick='editar("+e.getIdEstudiante()+")' class='botonRep' title='Pulsa aqu&iacute; para editar estudiante.'/></td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'><input type='button' value='Dar Baja' onClick='darBaja("+e.getIdEstudiante()+",\""+e.getNombre()+" "+e.getApellidoPa()+" "+e.getApellidoMa()+"\")' class='botonRep' title='Pulsa aqu&iacute; para dar de baja al estudiante.'/></td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'><input type='button' value='Eliminar' onClick='eliminar("+e.getIdEstudiante()+",\""+e.getNombre()+" "+e.getApellidoPa()+" "+e.getApellidoMa()+"\")' class='botonRep' title='Pulsa aqu&iacute; para eliminar al estudiante.'/></td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.println("<tr class='tr_decorado'>");
            out.println("     <td class='td_decorado' colspan='11' style='text-align:center'><span style='color:red'>No existen estudiantes registrados!<span></td>");
            out.println("</tr>");
        }
        out.println("    </tbody>");
        out.println("</table>");
        out.println("<!-- boton que muestra y oculta los estudiantes dados de baja -->");
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar estudiantes dados de baja'/></td>");
        out.println("    </tr>");
        out.println("</table><br/><br/>");
        // =========================== ESTUDIANTES DADOS DE BAJA ============================
        out.println("<div id='estudiantesBaja' style='display:none'>");
        out.println("<h2 class='decorado'>Estudiantes dados de Baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='3%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='19%' class='th_decoradoRowspan'>APELLIDO</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='9%' class='th_decoradoRowspan'>CI.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>TEL&Eacute;FONO</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>FECHA NAC.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>GENERO</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>EMAIL</th>");
        out.println("            <th width='16%' class='th_decoradoRowspan'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(Estudiante e : estudiantesInactivos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+e.getApellidoPa()+" "+e.getApellidoMa()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getCi()+" "+e.getExpedidoEn()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getTelefono()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getFechaNac()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getGenero()+"</td>");
            out.println("    <td class='th_decorado'>"+e.getEmail()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'><input type='button' value='Dar Alta' onClick='darAlta("+e.getIdEstudiante()+",\""+e.getNombre()+" "+e.getApellidoPa()+" "+e.getApellidoMa()+"\")' class='botonRep' title='Pulsa aqui para dar de alta al Estudiante "+e.getNombre()+"'/></td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='9' style='text-align:center'><span style='color:red'>No existen estudiantes dados de baja!</span></td>");
            out.write("</tr>");
        }
        out.println("    </tbody>");
        out.println("</table>");
        out.println("</div>");
        out.close();
    }

    private void deleteEstudiante() throws DataException{// accion <-- 66 
        PAGE = "";
        Connection c = null;
        int idEstudiante = Integer.parseInt(request.getParameter("idEstudiante"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            EstudianteManager eManager = ManagerFactory.getEstudianteManagerInstance(c);
            
            
            if( !eManager.existeEstudiante(idEstudiante) ){ // si no es usado recien se elimina
                eManager.deleteEstudiante(idEstudiante);
                msg = "<span style='text-align:center;color:blue'>El Estudiante ''"+nombre.toUpperCase()+"'' y sus dependencias, se eliminaron correctamente!</span>";
            }else{
                msg = "<span style='text-align:center;color:red'>No se puede eliminar al estudiante ''"+nombre.toUpperCase()+"'', <i>¡esta siendo usado!. Se sugiere dar de baja!</i></span>";
            }
            this.showEstudiantes(eManager.getEstudiantesActivos(), eManager.getEstudiantesInactivos(), msg);// enviando lista <Estudiante>
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteEstudiante() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteEstudiante() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteEstudiante() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteEstudiante() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }

    private void listarAdmin() throws DataException{ // accion<-- 67
        Connection c = null;
        try{
            c = Conector.getConexion();
            RolUsuarioManager ruManager = ManagerFactory.getRolUsuarioManagerInstance(c);
            request.setAttribute("RolUsuarioAdminActivos", ruManager.getAdminsActivos());    // enviamos listas de RolUsuario[rol,pais,ciudad,categoria,detalleDoc]
            request.setAttribute("RolUsuarioAdminInactivos", ruManager.getAdminsInactivos());// enviamos listas de RolUsuario[rol,pais,ciudad,categoria,detalleDoc]
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/recursosHumanos/administrativo/administrativo.jsp?idMenu=1&idSubMenu=1&idOpcion=1";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarAdmin() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarAdmin() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarAdmin() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarAdmin() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }

    private void formNewEditAdmin(int accion) throws DataException{// accion <-- 68 form nuevo;71 edit admin
        Connection c = null;
        int idUsuario = 0;
        int idRol = 0;
        if(accion == 71){// editar
            idUsuario = Integer.parseInt(request.getParameter("idUsuario"));
            idRol = Integer.parseInt(request.getParameter("idRol"));
        }
        try{
            c = Conector.getConexion();
            PaisManager pManager = ManagerFactory.getPaisManagerInstance(c);
            CiudadManager cManager = ManagerFactory.getCiudadManagerInstance(c);
            CargoManager caManager = ManagerFactory.getCargoManagerInstance(c);
            RolManager rManager = ManagerFactory.getRolManagerInstance(c);
            OpcionManager oManager = ManagerFactory.getOpcionManagerInstance(c);
            FacultadManager fManager = ManagerFactory.getFacultadManagerInstance(c);
            
            request.setAttribute("paises", pManager.getPaises());
            request.setAttribute("ciudades", cManager.getCiudadesActivos());
            request.setAttribute("cargos", caManager.getCargos());
            request.setAttribute("roles", rManager.getRoles()); 
            request.setAttribute("opciones", oManager.getOpciones()); 
            request.setAttribute("facultades", fManager.getFacultades()); 
            
            if(accion == 71){// editando
                RolUsuarioManager ruManager = ManagerFactory.getRolUsuarioManagerInstance(c);
                AccesoManager aManager = ManagerFactory.getAccesoManagerInstance(c);
                request.setAttribute("rolUsuario", ruManager.getRolUsuarioAdmin(idUsuario, idRol));
                request.setAttribute("accesosUsuario", aManager.getAccesos(idUsuario, idRol)); 
            }
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/recursosHumanos/administrativo/formAdmin.jsp?idMenu=1&idSubMenu=1&idOpcion=1";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formNewEditAdmin() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formNewEditAdmin() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formNewEditAdmin() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formNewEditAdmin() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }

    private void newEditAdmin(int accion) throws DataException, IOException{// accion <-- 69 nuevo admin;72 <-- update admin
        PAGE = "";
        PrintWriter out = response.getWriter();
        int idUsuario = 0;
        if(accion == 72)
            idUsuario = Integer.parseInt(request.getParameter("idUsuario"));
        
        String nombre = request.getParameter("nombre");
        String apellido = request.getParameter("apellidos");
        String ci = request.getParameter("ci");
        String expedidoEn = request.getParameter("expedidoEn");
        char genero = request.getParameter("genero").charAt(0);
        String telefono = request.getParameter("telefono");
        String email = request.getParameter("email");
        String direccion = request.getParameter("direccion");
        String fechaNac = request.getParameter("year")+"/"+request.getParameter("mes")+"/"+request.getParameter("dia");
        String login = request.getParameter("cuenta");
        String password = request.getParameter("1psw");
        
        int idFacultad = Integer.parseInt(request.getParameter("facultad"));
        int idPais = Integer.parseInt(request.getParameter("pais"));
        int idCiudad = Integer.parseInt(request.getParameter("ciudad"));
        int idCargo = Integer.parseInt(request.getParameter("cargo"));
        
        int idRol = Integer.parseInt(request.getParameter("rol"));
        String[] submenus = request.getParameterValues("check_submenu");
        String[] opciones = request.getParameterValues("check_opcion");
        List<String> resOpiones = new ArrayList<String>();
        // unimos submenus y opciones ej: a={1,3,4}; b={1,2,3}; aUb={1,2,3,4}
        for(String idOpcionDefault : submenus)
            resOpiones.add(idOpcionDefault);
        
        if(opciones != null)
            for(String idOpcion : opciones){
                boolean existe = false;
                for(String idOpcionDefault : submenus)
                    if(idOpcion.equals(idOpcionDefault))
                        existe = true;
                if(!existe)
                    resOpiones.add(idOpcion);
            }
        // fin proceso de union de dos arreglos
        
        
        Connection c = null;
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            UsuarioManager uManager = ManagerFactory.getUsuarioManagerInstance(c);
            DetalleAdministrativoManager daManager = ManagerFactory.getDetalleAdministrativoManagerInstance(c);
            RolUsuarioManager ruManager = ManagerFactory.getRolUsuarioManagerInstance(c);
            AccesoManager aManager = ManagerFactory.getAccesoManagerInstance(c);
            
            Usuario u = new Usuario();
            u.setNombre(nombre);
            u.setApellido(apellido);
            u.setCi(ci);
            u.setExpedidoEn(expedidoEn);
            u.setGenero(genero);
            u.setTelefono(telefono);
            u.setEmail(email);
            u.setDireccion(direccion);
            u.setFechaNac(fechaNac);
            u.setFoto("NO TIENE");
            u.setLogin(login);
            u.setPassword(password);
            
            DetalleAdministrativo da = new DetalleAdministrativo();
            da.setIdFacultad(idFacultad);
            da.setIdPais(idPais);
            da.setIdCiudad(idCiudad);
            da.setIdCargo(idCargo);
            
            RolUsuario ru = new RolUsuario();
            ru.setIdRol(idRol);
            ru.setActivo(true);
            
            if(accion == 69)
                idUsuario = uManager.getIdUsuario();
            
            List<Acceso> accesos = new ArrayList<Acceso>();
            for(String opcion : resOpiones){
                Acceso a = new Acceso();
                String[] ides = opcion.split("_");
                a.setIdUsuario(idUsuario);
                a.setIdRol(idRol);
                a.setIdMenu(Integer.parseInt(ides[0]));
                a.setIdSubMenu(Integer.parseInt(ides[1]));
                a.setIdOpcion(Integer.parseInt(ides[2]));
                accesos.add(a);
            }
            
            if(accion == 69){// nuevo admin
                u.setIdUsuario(idUsuario);
                da.setIdDetalleAdminist(idUsuario);
                ru.setIdUsuario(idUsuario);
                
                uManager.saveUsuario(u);
                daManager.saveDetalleAdministrativo(da);
                ruManager.saveRolUsuario(ru);
                aManager.saveAccesos(accesos);
                msg = "El administrativo se registro correctamente. <i>Verifique los datos!</i>";
            }else{// accion 72 update
                u.setIdUsuario(idUsuario);
                da.setIdDetalleAdminist(idUsuario);
                uManager.updateUsuario(u);
                daManager.updateDetalleAdministrativo(da);
                aManager.deleteAccesos(idUsuario, idRol);
                aManager.saveAccesos(accesos);
                msg = "El administrativo se modifico correctamente. <i>Verifique los datos!</i>";
            }
            
            // construimos el html de respuesta
            out.println("<center>");
            out.println("<fieldset style='display: block;border: 1px solid #297a9f;border-radius: 8px;width: 50%;padding: 10px 10px 6px;margin-top: 10px;background-color: white;box-shadow: 0px 5px 10px #70b8d6, 0 0 0 5px #278cba inset;position: relative;'>");//
            out.println("<div style='clear: left; text-align: center;'><h3>"+msg+"</h3></div>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>Nombre :</label>");
            out.println("    <label style='float:left; margin-left:0.2em;'><b>"+u.getNombre().toUpperCase()+"</b></label>");
            out.println("</div><br/>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>Apellido :</label>");
            out.println("    <label style='float:left; margin-left:0.2em;'><b>"+u.getApellido().toUpperCase()+"</b></label>");
            out.println("</div><br/>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>C.I. :</label>");
            out.println("    <label style='float:left; margin-left:0.2em;'><b>"+u.getCi()+" "+u.getExpedidoEn()+"</b></label>");
            out.println("</div><br/><br/>");
            out.println("<div style='clear: both'>");
            out.println("    <label class='form_align30'>&nbsp;</label>");
            out.println("    <table border='0' style='float: left'>");
            out.println("        <tr>");
            out.println("            <td style='text-align:right'><br/><input type='button' value='Ver lista de administrativos' onClick='listarAdmin()' class='boton' id='botonSub' title='Pulse aqu&iacute; para Ingresar'/>&nbsp;&nbsp;</td>");
            out.println("            <td><br/>&nbsp;&nbsp;"+((accion==69)?"<input type='button' name='addAdmin' value='A&nacute;adir Administrativo' onClick='addAdmin()' class='boton' title='Pulse aqu&iacute; para a&nacute;adir administrativo.'/>":"")+"</td>");
            out.println("        </tr>");
            out.println("    </table>");
            out.println("</div>");
            out.println("</center>");
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditAdmin(accion) e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditAdmin(accion) DataException "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditAdmin(accion) ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditAdmin(accion) Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
            out.close();
        }
    }

    private void existeLoginAjax() throws DataException, IOException{// accion <-- 70 
        PAGE = "";
        Connection c = null;
        String login = request.getParameter("login");
        java.io.PrintWriter out = response.getWriter();
        try{
            c = Conector.getConexion();
            UsuarioManager uManager = ManagerFactory.getUsuarioManagerInstance(c);
            boolean existe = uManager.existeLogin(login);
            out.println(existe);
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion existeLoginAjax() DataException = "+e.getMessage());
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion existeLoginAjax() Exception = "+ex.getMessage());
        }finally{
            SqlManager.closeConexion(c);
            out.close();
        }
    }

    private void darAltaBajaAdmin(int accion) throws DataException{//accion <--73 baja; 74 <-- alta
        PAGE = "";
        Connection c = null;
        int idUsuario = Integer.parseInt(request.getParameter("idUsuario"));
        int idRol = Integer.parseInt(request.getParameter("idRol"));
        String nombre = request.getParameter("nombre");
        
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            RolUsuarioManager ruManager = ManagerFactory.getRolUsuarioManagerInstance(c);
            
            if(accion == 73){// damos baja
                ruManager.darBajaRolUsuario(idUsuario, idRol);
                msg = "<p style='text-align:center;color:blue'>El Administrativo ''"+nombre.toUpperCase()+"'' se di&oacute; de BAJA correctamente!</p>";
            }else{// 74 damos alta
                ruManager.darAltaRolUsuario(idUsuario, idRol);
                msg = "<p style='text-align:center;color:blue'>El Administrativo ''"+nombre.toUpperCase()+"'' se di&oacute; de ALTA correctamente!</p>";
            }
            this.showAdminis(ruManager.getAdminsActivos(), ruManager.getAdminsInactivos(), msg);// enviando lista <RolUsuario>
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaAdmin(accion) DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaAdmin(accion) DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> darAltaBajaAdmin(accion) ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> darAltaBajaAdmin(accion) Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }

	private void indexParametro() throws DataException{// accion <-- 75
        PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/adminParametro/index.jsp";
    }

    private void listarIsXfacultadMatricula(int accion) throws DataException { // accion <-- 76 listamos el parametro;77<-- update matricula
        Connection c = null;
        int idParametro = 0;
        boolean vmXfacultad = false;
        if(accion == 77){
            idParametro = Integer.parseInt(request.getParameter("idParametro"));
            vmXfacultad = Boolean.parseBoolean(request.getParameter("vmXfacultad"));
        }
        try{
            c = Conector.getConexion();
            ParametroManager pManager = ManagerFactory.getParametroManagerInstance(c);
            if(accion == 77){
                Parametro p = new Parametro();
                p.setIdParametro(idParametro);
                p.setVentaMatriculaXfacultad(vmXfacultad);
                pManager.updateParametro(p);
				if(vmXfacultad)
                    msg = "Se actualiz&oacute; corr&eacute;ctamente la venta de Matr&iacute;cula por Facultad.";
                else
                    msg = "Se actualiz&oacute; corr&eacute;ctamente la venta de Matr&iacute;cula General.";
                request.setAttribute("msg", msg);
            }
            
            request.setAttribute( "parametro", pManager.getParametro() );// enviamos el parametro
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/adminParametro/matriculaXfacultad/xfacultad.jsp?idMenu=1&idSubMenu=5&idOpcion=1";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarIsXfacultadMatricula() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarIsXfacultadMatricula() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarIsXfacultadMatricula() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarIsXfacultadMatricula() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    private void showAdminis(List<RolUsuario> adminsActivos, List<RolUsuario> adminsInactivos, String msg) throws IOException {
        PrintWriter out = response.getWriter();
        
        out.println("<h2 class='decorado'>Lista de Administrativos</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("   <tr>");
        out.println("       <td style='text-align: right'><input type='button' class='boton' value='Anadir Nuevo Administrativo' onclick='nuevo()' title='Pulsa aqui para nuevo administrativo.'/></td>");
        out.println("   </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='3%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='19%' class='th_decoradoRowspan'>APELLIDO</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='9%' class='th_decoradoRowspan'>CI.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>TEL&Eacute;FONO</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>FECHA NAC.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>LOGIN</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>EMAIL</th>");
        out.println("            <th width='16%' class='th_decoradoRowspan' colspan='2'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(RolUsuario ru : adminsActivos){
            Usuario u = ru.getUsuario();
            Rol r = ru.getRol();
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+u.getApellido()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getCi()+" "+u.getExpedidoEn()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getTelefono()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getFechaNac()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getLogin()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getEmail()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'><input type='button' value='Editar' onclick='editar("+u.getIdUsuario()+","+r.getIdRol()+")' class='botonRep' title='Pulsa aqu&iacute; para editar administrativo.'/></td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'><input type='button' value='Dar Baja' onClick='darBaja("+u.getIdUsuario()+","+r.getIdRol()+",\""+u.getNombre()+" "+u.getApellido()+"\")' class='botonRep' title='Pulsa aqu&iacute; para dar de baja al administrativo.'/></td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.println("<tr class='tr_decorado'>");
            out.println("     <td class='td_decorado' colspan='10' style='text-align:center'><span style='color:red'>No existen Administrativos registrados!<span></td>");
            out.println("</tr>");
        }
        out.println("    </tbody>");
        out.println("</table>");
        out.println("<!-- boton que muestra y oculta los docentes dados de baja -->");
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar administrativos dados de baja'/></td>");
        out.println("    </tr>");
        out.println("</table><br/><br/>");
        // =========================== DOCENTES DADOS DE BAJA ============================
        out.println("<div id='adminsBaja' style='display:none'>");
        out.println("<h2 class='decorado'>Administrativos dados de Baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='3%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='19%' class='th_decoradoRowspan'>APELLIDO</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='9%' class='th_decoradoRowspan'>CI.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>TEL&Eacute;FONO</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>FECHA NAC.</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan'>LOGIN</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan'>EMAIL</th>");
        out.println("            <th width='16%' class='th_decoradoRowspan'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(RolUsuario ru : adminsInactivos){
            Usuario u = ru.getUsuario();
            Rol r = ru.getRol();
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+u.getApellido()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getCi()+" "+u.getExpedidoEn()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getTelefono()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getFechaNac()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getLogin()+"</td>");
            out.println("    <td class='th_decorado'>"+u.getEmail()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'><input type='button' value='Dar Alta' onClick='darAlta("+u.getIdUsuario()+","+r.getIdRol()+",\""+u.getNombre()+" "+u.getApellido()+"\")' class='botonRep' title='Pulsa aqui para dar de alta al Administrativo "+u.getNombre()+"'/></td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='9' style='text-align:center'><span style='color:red'>No existen Administrativos dados de baja!</span></td>");
            out.write("</tr>");
        }
        out.println("    </tbody>");
        out.println("</table>");
        out.println("</div>");
        out.close();
    }
    
    public void darAltaBajaDepto(int accion)throws DataException{
        // accion = 81 = dar baja departamento, accion = 82 = dar alta departamento
        PAGE = "";
        Connection c = null;
        int idDepartamento = Integer.parseInt(request.getParameter("idDepartamento"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            DepartamentoManager dmanager = ManagerFactory.getDepartamentoManagerInstance(c);
            if(accion == 81){
                dmanager.darBaja(idDepartamento);
                msg = "<p style='text-align:center;color:blue'>El departamento ''"+nombre.toUpperCase()+"'' Se dieron de BAJA correctamente!</p>";
            }else{
                dmanager.darAlta(idDepartamento);
                msg = "<p style='text-align:center;color:blue'>El departamento ''"+nombre.toUpperCase()+"'' Se dieron de ALTA correctamente!</p>";
            }
            List<Departamento> deptos = dmanager.getDeptos();
            List<Departamento> deptosInactivos = dmanager.getDeptosInactivos();
            this.showDeptos(deptos, deptosInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaDepto() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaDepto() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaDepto() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaDepto() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    private void showDeptos(List<Departamento> deptos, List<Departamento> deptosInactivos, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Lista de Departamentos de Bolivia</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Anadir Nuevo Departamento' onclick='$.fn.addDepto()'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='50%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan' colspan='3'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(Departamento d : deptos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+d.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+d.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Editar' onclick='$.fn.editar("+d.getIdDepartamento()+",\""+d.getNombre()+"\""+",\""+d.getSigla()+"\")' class='botonRep' title='Pulsa aqui para editar el departamento'/>");
            out.println("    </td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Dar Baja' onClick='$.fn.darBaja("+d.getIdDepartamento()+",\""+d.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de baja el departamento'/>");
            out.println("    </td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Eliminar' onClick='$.fn.eliminar("+d.getIdDepartamento()+",\""+d.getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar el departamento'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='6' style='text-align:center'><span style='color:red'>No existen Departamentos registrados!</span></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        
        out.println("<!-- boton que muestra y oculta los departamentos dedos de baja -->");
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar bajas'/></td>");
        out.println("    </tr>");
        out.println("</table>      <br/><br/>");
        
        // =========================== DEPARTAMENTOS DADOS DE BAJA ============================
        out.println("<div id='deptosBaja' style='display:none'>");
        
        out.println("<h2 class='decorado'>Departamentos de Bolivia dados de Baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='50%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>ACCION</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(Departamento d : deptosInactivos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+d.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+d.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("       <input type='button' value='Dar Alta' onClick='$.fn.darAlta("+d.getIdDepartamento()+",\""+d.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de alta el depto. \""+d.getNombre()+"\"'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='4' style='text-align:center'><span style='color:red'>No existen departamentos dados de baja!<span></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        out.println("</div> <!-- end id='deptosBaja' -->");
    }
    
    public void listarCargos()throws DataException{
        // accion = 83 = lista cargos  
        Connection c = null;
        try{
            c = Conector.getConexion();
            CargoManager cmanager = ManagerFactory.getCargoManagerInstance(c);
            request.setAttribute("cargos", cmanager.getCargos());
            request.setAttribute("cargosBaja", cmanager.getCargosBaja());
            
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/AdminCargo/cargos.jsp?idMenu=1&idSubMenu=2&idOpcion=6";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarCargos() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarCargos() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> listarPaises() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> listarPaises() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }

    private void newEditCargo(int accion) throws DataException{
         // accion = 84 = registra un cargo, accion = 85 = actualiza datos de cargo
        PAGE = "";
        Connection c = null;
        int idCargo = 0;
        String nombre = request.getParameter("nombre");
        //String sigla = request.getParameter("sigla");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CargoManager cmanager = ManagerFactory.getCargoManagerInstance(c);
            Cargo carg = new Cargo();
            carg.setNombre(nombre);
            //carg.setSigla(sigla);
            if(accion == 84){
                idCargo = cmanager.getIdCargo();
                carg.setIdCargo(idCargo);
                cmanager.saveCargo(carg);
                msg = "<p style='text-align:center;color:blue'>El cargo ''"+nombre.toUpperCase()+"'' se registro correctamente!</p>";
            }else{
                idCargo = Integer.parseInt(request.getParameter("idCargo"));
                carg.setIdCargo(idCargo);
                cmanager.updateCargo(carg);
                msg = "<p style='text-align:center;color:blue'>El cargo ''"+nombre.toUpperCase()+"'' se actualizo correctamente!</p>";
            }
            List<Cargo> cargos = cmanager.getCargos();
            
            
            List<Cargo> cargosInactivos = cmanager.getCargosDadosDeBaja();
            this.showCargos(cargos, cargosInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditCargo() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditCargo() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditCargo() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditCargo() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }

    private void deleteCargo() throws DataException{
          // accion = 86 = elimina un cargo
        PAGE = "";
        Connection c = null;
        int idCargo = Integer.parseInt(request.getParameter("idCargo"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CargoManager cmanager = ManagerFactory.getCargoManagerInstance(c);
            if(!cmanager.isUseInDetalleAdminist(idCargo)){ // si no es usado recien se elimina
                cmanager.deleteCargo(idCargo);
                msg = "<p style='text-align:center;color:blue'>El cargo ''"+nombre.toUpperCase()+"'' se elimino correctamente!</p>";
            }else{
                msg = "<p style='text-align:center;color:red'>No se puede eliminar el cargo ''"+nombre.toUpperCase()+"'', ¡esta siendo usado!. Se sugiere dar de baja!</p>";
            }
            List<Cargo> cargos = cmanager.getCargos();
            List<Cargo> cargosInactivos = cmanager.getCargosDadosDeBaja();
            this.showCargos(cargos, cargosInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteCargo() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteCargo() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> deleteCargo() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> deleteCargo() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }

    private void darAltaBajaCargo(int accion) throws DataException{
       // accion = 87 = dar baja el cargo, accion = 88 = dar alta  cargo
        PAGE = "";
        Connection c = null;
        int idCargo = Integer.parseInt(request.getParameter("idCargo"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CargoManager cmanager = ManagerFactory.getCargoManagerInstance(c);
            if(accion == 87){
                cmanager.darBaja(idCargo);
                msg = "<p style='text-align:center;color:blue'>El cargo ''"+nombre.toUpperCase()+"'' se dio de BAJA correctamente!</p>";
            }else{
                cmanager.darAlta(idCargo);
                msg = "<p style='text-align:center;color:blue'>El cargo ''"+nombre.toUpperCase()+"'' se dio de ALTA correctamente!</p>";
            }
            List<Cargo> cargos = cmanager.getCargos();
            List<Cargo> cargosInactivos = cmanager.getCargosDadosDeBaja();
            this.showCargos(cargos, cargosInactivos,msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darBajaCargo() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darBajaCargo() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darBajaCargo() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darBajaCargo() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    private void showCargos(List<Cargo> cargos, List<Cargo> cargosInactivos, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Lista de Cargos</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 80%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Anadir Nuevo Cargo' onclick='$.fn.addCargo()'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 80%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='65%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(Cargo car : cargos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+car.getNombre()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Editar' onclick='$.fn.editar("+car.getIdCargo()+",\""+car.getNombre()+"\")' class='botonRep' title='Pulsa aqui para editar cargo'/>");
            out.println("        <input type='button' value='Dar Baja' onClick='$.fn.darBaja("+car.getIdCargo()+",\""+car.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de baja el cargo'/>");
            out.println("        <input type='button' value='Eliminar' onClick='$.fn.eliminar("+car.getIdCargo()+",\""+car.getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar el cargo'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='4' style='text-align:center'><p style='color:red'>No existen Cargos registrados!<p></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        
        out.println("<!-- boton que muestra y oculta los paises dedos de baja -->");
        out.println("<table class='miReporte' style='width: 80%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar bajas'/></td>");
        out.println("    </tr>");
        out.println("</table>      <br/><br/>");
        
        // =========================== CARGOS DADOS DE BAJA ============================
        out.println("<div id='cargosBaja' style='display:none'>");
        
        out.println("<h2 class='decorado'>Lista de Cargos dados de Baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 80%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='65%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>ACCION</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(Cargo car : cargosInactivos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+car.getNombre()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("       <input type='button' value='Dar Alta' onClick='$.fn.darAlta("+car.getIdCargo()+",\""+car.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de alta al cargo "+car.getNombre()+"'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='4' style='text-align:center'><p style='color:red'>No existen Cargos dados de BAJA!<p></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        out.println("</div> <!-- end id='cargosBaja' -->");
    }
    
    public void listarCarreras()throws DataException{
        // accion = 89 = lista carreras
        Connection c = null;
        try{
            c = Conector.getConexion();
            FacultadManager fmanager = ManagerFactory.getFacultadManagerInstance(c);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            request.setAttribute("facultades", fmanager.getFacultades());
            request.setAttribute("carreras", cmanager.getCarrerasAll());
            request.setAttribute("carrerasInactivos", cmanager.getCarrerasInactivos());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminAcademico/Carrera/carreras.jsp?idMenu=1&idSubMenu=3&idOpcion=2";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarCarreras() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> listarCarreras() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarCarreras() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> listarCarreras() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditCarrera(int accion)throws DataException{
        // accion = 90 = registra carrera, accion = 91 = edita una carrera
        PAGE = "";
        Connection c = null;
        int idCarrera = 0;
        String nombre = request.getParameter("nombre").trim();
        String sigla = request.getParameter("sigla").trim();
        String fecha = request.getParameter("year")+"-"+request.getParameter("mes")+"-"+request.getParameter("dia");
        int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            Carrera ca = new Carrera();
            ca.setNombre(nombre);
            ca.setSigla(sigla);
            ca.setFecha(fecha);
            ca.setIdFacultad(idFacultad);
            if(accion == 90){
                idCarrera = cmanager.getIdCarrera();
                ca.setIdCarrera(idCarrera);
                ca.setActivo(true);
                cmanager.saveCarrera(ca);
                msg = "<p style='text-align:center;color:blue'>La carrera ''"+nombre.toUpperCase()+"'' se registro correctamente!</p>";
            }else{
                idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
                ca.setIdCarrera(idCarrera);
                cmanager.updateCarrera(ca);
                msg = "<p style='text-align:center;color:blue'>La carrera ''"+nombre.toUpperCase()+"'' se modifico correctamente!</p>";
            }
            List<Carrera> carreras = cmanager.getCarrerasAll();
            List<Carrera> carrerasInactivos = cmanager.getCarrerasInactivos();
            this.showCarreras(carreras, carrerasInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditCarrera() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditCarrera() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditCarrera() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditCarrera() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void deleteCarrera()throws DataException{
        // accion = 92 = elimina una carrera
        PAGE = "";
        Connection c = null;
        int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            if(!cmanager.isUseCarreraForDelete(idCarrera)){ // si no es usado recien se elimina
                cmanager.deleteCarrera(idCarrera);
                msg = "<p style='text-align:center;color:blue'>La Carrera. ''"+nombre.toUpperCase()+"'' y sus dependencias de materias, se eliminaron correctamente!</p>";
            }else{
                msg = "<p style='text-align:center;color:red'>No se puede eliminar la carrera. ''"+nombre.toUpperCase()+"'', ¡esta ciendo usado!. Se sugiere dar de baja!</p>";
            }
            List<Carrera> carreras = cmanager.getCarrerasAll();
            List<Carrera> carrerasInactivos = cmanager.getCarrerasInactivos();
            this.showCarreras(carreras, carrerasInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> deleteCarrera() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> deleteCarrera() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> deleteDepto() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> deleteDepto() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void darAltaBajaCarrera(int accion)throws DataException{
        // accion = 93 = dar baja carrera, accion = 94 = dar alta carrera
        PAGE = "";
        Connection c = null;
        int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            if(accion == 93){
                cmanager.darBaja(idCarrera);
                msg = "<p style='text-align:center;color:blue'>La carrera ''"+nombre.toUpperCase()+"'' y sus dependencias de materias. Se dieron de BAJA correctamente!</p>";
            }else{
                cmanager.darAlta(idCarrera);
                msg = "<p style='text-align:center;color:blue'>La carrera ''"+nombre.toUpperCase()+"'' y sus dependencias de materias. Se dieron de ALTA correctamente!</p>";
            }
            List<Carrera> carreras = cmanager.getCarrerasAll();
            List<Carrera> carrerasInactivos = cmanager.getCarrerasInactivos();
            this.showCarreras(carreras, carrerasInactivos, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaCarrera() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaCarrera() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaCarrera() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaCarrera() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    private void showCarreras(List<Carrera> carreras, List<Carrera> carrerasInactivos, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Lista de Especialidades por Unidades Educativas</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Anadir Especialidades' onclick='$.fn.addCarrera()'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>UNID. EDUCATIVA</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>FECHA CREACION</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan' colspan='3'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(Carrera c : carreras){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+c.getFacultad().getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+c.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+c.getSigla()+"</td>");
            out.println("    <td class='th_decorado'>"+c.getFecha()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Editar' onclick='$.fn.editar("+c.getIdFacultad()+","+c.getIdCarrera()+",\""+c.getNombre()+"\")' class='botonRep' title='Pulsa aqui para editar la carrera'/>");
            out.println("    </td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Dar Baja' onClick='$.fn.darBaja("+c.getIdCarrera()+",\""+c.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de baja la carrera'/>");
            out.println("    </td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Eliminar' onClick='$.fn.eliminar("+c.getIdCarrera()+",\""+c.getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar la carrera'/>");
            out.println("    </td>");
            out.println("</tr>");
            out.println("<input type='hidden' name='sigla"+c.getIdCarrera()+"' id='sigla"+c.getIdCarrera()+"' value='"+c.getSigla()+"' />");
            out.println("<input type='hidden' name='fecha"+c.getIdCarrera()+"' id='fecha"+c.getIdCarrera()+"' value='"+c.getFecha()+"' />");
            out.println("<input type='hidden' name='nombreFacultad"+c.getIdCarrera()+"' id='nombreFacultad"+c.getIdCarrera()+"' value='"+c.getFacultad().getNombre()+"' />");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='9' style='text-align:center'><span style='color:red'>No existen carreras registrados!</span></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        
        out.println("<!-- boton que muestra y oculta los departamentos dedos de baja -->");
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar bajas'/></td>");
        out.println("    </tr>");
        out.println("</table>      <br/><br/>");
        
        // =========================== DEPARTAMENTOS DADOS DE BAJA ============================
        out.println("<div id='carrerasBaja' style='display:none'>");
        
        out.println("<h2 class='decorado'>Especialidades de Unid. Educativas dados de Baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>UNID.EDUCATIVA</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>ESPECIALIDAD</th>");
        out.println("            <th width='15%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>FECHA CREACION</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>ACCION</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(Carrera c : carrerasInactivos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+c.getFacultad().getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+c.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+c.getSigla()+"</td>");
            out.println("    <td class='th_decorado'>"+c.getFecha()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("       <input type='button' value='Dar Alta' onClick='$.fn.darAlta("+c.getIdCarrera()+",\""+c.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de alta la carrera \""+c.getNombre()+"\"'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='6' style='text-align:center'><span style='color:red'>No existen carreras de Facultades dados de baja!<span></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        out.println("</div> <!-- end id='carrerasBaja' -->");
    }
    
    public void boxCarreras()throws DataException{
        // accion = 95 = muestra carreras para seleccionar
        Connection c = null;
        try{
            c = Conector.getConexion();
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            request.setAttribute("carreras", cmanager.getCarrerasAll());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminAcademico/Materia/materias.jsp?idMenu=1&idSubMenu=3&idOpcion=3";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarCarreras() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> listarCarreras() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarCarreras() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> listarCarreras() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void listarMateriasPorCarrera()throws DataException{
        // accion = 96 = listar materias por carrera
        PAGE = ""; // for ajax!
        Connection c = null;
        int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
        try{
            c = Conector.getConexion();
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            MateriaManager mmanager = ManagerFactory.getMateriaManagerInstance(c);
            List<Materia> materias = mmanager.getMateriasPorCarrera(idCarrera);
            List<Materia> materiasInactivos = mmanager.getMateriasInactivosPorCarrera(idCarrera);
            Carrera carrera = cmanager.getCarrera(idCarrera);
            this.showMaterias(materias,materiasInactivos,carrera,"");
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarMateriasPorCarrera() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> listarMateriasPorCarrera() DataException "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarMateriasPorCarrera() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> listarMateriasPorCarrera() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditMateria(int accion)throws DataException{
        // accion = 97 = registra una materia, accion = 98 = edit materia
        PAGE = "";
        Connection c = null;
        int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
        int idMateria = 0;
        String nombre = request.getParameter("nombre").trim();
        String sigla = request.getParameter("sigla").trim();
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            MateriaManager mmanager = ManagerFactory.getMateriaManagerInstance(c);
            Materia m = new Materia();
            m.setIdCarrera(idCarrera);
            m.setNombre(nombre);
            m.setSigla(sigla);
            if(accion == 97){
                idMateria = mmanager.getIdMateria(idCarrera);
                m.setIdMateria(idMateria);
                m.setActivo(true);
                mmanager.saveMateria(m);
                msg = "<p style='text-align:center;color:blue'>La materia ''"+nombre.toUpperCase()+"'' se registro correctamente!</p>";
            }else{
                idMateria = Integer.parseInt(request.getParameter("idMateria"));
                m.setIdMateria(idMateria);
                mmanager.updateMateria(m);
                msg = "<p style='text-align:center;color:blue'>La materua ''"+nombre.toUpperCase()+"'' se modifico correctamente!</p>";
            }
            List<Materia> materias = mmanager.getMateriasPorCarrera(idCarrera);
            List<Materia> materiasInactivos = mmanager.getMateriasInactivosPorCarrera(idCarrera);
            Carrera carrera = cmanager.getCarrera(idCarrera);
            this.showMaterias(materias,materiasInactivos,carrera,msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditMateria() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditMateria() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditMateria() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditMateria() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void deleteMateria()throws DataException{
        // accion = 99 = elimna materia
        PAGE = "";
        Connection c = null;
        int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
        int idMateria = Integer.parseInt(request.getParameter("idMateria"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            MateriaManager mmanager = ManagerFactory.getMateriaManagerInstance(c);
            if(!mmanager.isUseMateriaForDelete(idCarrera, idMateria)){ // si no es usado recien se elimina
                mmanager.deleteMateria(idCarrera, idMateria);
                msg = "<p style='text-align:center;color:blue'>La Materia ''"+nombre.toUpperCase()+"'' se elimino correctamente!</p>";
            }else{
                msg = "<p style='text-align:center;color:red'>No se puede eliminar la materia ''"+nombre.toUpperCase()+"'', ¡esta ciendo usado!. Se sugiere dar de baja!</p>";
            }
            List<Materia> materias = mmanager.getMateriasPorCarrera(idCarrera);
            List<Materia> materiasInactivos = mmanager.getMateriasInactivosPorCarrera(idCarrera);
            Carrera carrera = cmanager.getCarrera(idCarrera);
            this.showMaterias(materias,materiasInactivos,carrera,msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> deleteMateria() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> deleteMateria() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> deleteMateria() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> deleteMateria() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void darAltaBajaMateria(int accion)throws DataException{
        // accion = 100 = dar baja materia, accion = 101 = da alta una materia
        PAGE = "";
        Connection c = null;
        int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
        int idMateria = Integer.parseInt(request.getParameter("idMateria"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            MateriaManager mmanager = ManagerFactory.getMateriaManagerInstance(c);
            if(accion == 100){
                mmanager.darBaja(idCarrera, idMateria);
                msg = "<p style='text-align:center;color:blue'>La materia ''"+nombre.toUpperCase()+"'' se dieron de BAJA correctamente!</p>";
            }else{
                mmanager.darAlta(idCarrera, idMateria);
                msg = "<p style='text-align:center;color:blue'>La materia ''"+nombre.toUpperCase()+"'' se dieron de ALTA correctamente!</p>";
            }
            List<Materia> materias = mmanager.getMateriasPorCarrera(idCarrera);
            List<Materia> materiasInactivos = mmanager.getMateriasInactivosPorCarrera(idCarrera);
            Carrera carrera = cmanager.getCarrera(idCarrera);
            this.showMaterias(materias,materiasInactivos,carrera,msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaMateria() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaMateria() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaMateria() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaMateria() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    private void showMaterias(List<Materia> materias, List<Materia> materiasInactivos, Carrera c, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<input type='hidden' name='idCarrera2' id='idCarrera2' value='"+c.getIdCarrera()+"' />");
        out.println("<input type='hidden' name='nomCarrera2' id='nomCarrera2' value='"+c.getNombre()+"' />");
        out.println("<h2 class='decorado'>Lista de Materias de la carrera: ''"+c.getNombre()+"''</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Anadir Nueva Materia' onclick='$.fn.addMateria()'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='45%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan' colspan='3'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        for(Materia m : materias){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+m.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+m.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Editar' onclick='$.fn.editar("+m.getIdCarrera()+","+m.getIdMateria()+",\""+m.getNombre()+"\",\""+m.getSigla()+"\")' class='botonRep' title='Pulsa aqui para editar la materia'/>");
            out.println("    </td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Dar Baja' onClick='$.fn.darBaja("+m.getIdCarrera()+","+m.getIdMateria()+",\""+m.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de baja la materia'/>");
            out.println("    </td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Eliminar' onClick='$.fn.eliminar("+m.getIdCarrera()+","+m.getIdMateria()+",\""+m.getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar la materia'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='6' style='text-align:center'><span style='color:red'>No existen materias registrados!</span></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        
        out.println("<!-- boton que muestra y oculta los departamentos dedos de baja -->");
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar bajas'/></td>");
        out.println("    </tr>");
        out.println("</table>      <br/><br/>");
        
        // =========================== DEPARTAMENTOS DADOS DE BAJA ============================
        out.println("<div id='materiasBaja' style='display:none'>");
        
        out.println("<h2 class='decorado'>Materias de la especialidad ''"+c.getNombre()+"'' dados de Baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='50%' class='th_decoradoRowspan'>NOMBRE</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>ACCION</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(Materia m : materiasInactivos){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+m.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+m.getSigla()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("       <input type='button' value='Dar Alta' onClick='$.fn.darAlta("+m.getIdCarrera()+","+m.getIdMateria()+",\""+m.getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de alta la materia \""+m.getNombre()+"\"'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='4' style='text-align:center'><span style='color:red'>No existen materias de la carrera ''"+c.getNombre()+"'' dados de baja!<span></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table>");
        out.println("</div> <!-- end id='materiasBaja' -->");
    }
    
    public void pensumCarrera()throws DataException{
        // accion = 102 = muestra el pensum de la carrera
        Connection c = null;
        int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
        try{
            c = Conector.getConexion();
            PensumManager pmanager = ManagerFactory.getPensumManagerInstance(c);
            GestionManager gmanager = ManagerFactory.getGestionManagerInstance(c);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            Pensum pensum = pmanager.getPensumVigente(idCarrera);
            List<Pensum> pensumAnteriores = pmanager.getPensumsInactivos(idCarrera);
            Carrera carrera = cmanager.getCarreraBasic(idCarrera);
            int year = Calendar.getInstance().get(Calendar.YEAR);
            year--;
            
            request.setAttribute("carrera", carrera);
            request.setAttribute("pensum", pensum);
            request.setAttribute("pensumAnteriores", pensumAnteriores);
            request.setAttribute("gestionesVigentes", gmanager.getGestVigentesYfuturosPorFacult(carrera.getIdFacultad()));
            request.setAttribute("gestionesYearBack", gmanager.getGestionesByFacultYear(carrera.getIdFacultad(), year));
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminAcademico/Carrera/pensum.jsp?idMenu=1&idSubMenu=3&idOpcion=2";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> pensumCarrera() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> pensumCarrera() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> pensumCarrera() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> pensumCarrera() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void listarGestiones()throws DataException{
        // accion = 103 = lista gestiones
        Connection c = null;
        try{
            c = Conector.getConexion();
            FacultadManager fmanager = ManagerFactory.getFacultadManagerInstance(c);
            GestionManager gmanager = ManagerFactory.getGestionManagerInstance(c);
            TipoGestionManager tgmanager = ManagerFactory.getTipoGestionManagerInstance(c);
            request.setAttribute("tipoGestiones", tgmanager.getTipoGestiones());
            request.setAttribute("facultades", fmanager.getFacultades());
            request.setAttribute("gestiones", gmanager.getGestVigentesYfuturos());
            request.setAttribute("gestionesPasadas", gmanager.getGestPasadas());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminAcademico/Gestion/gestiones.jsp?idMenu=1&idSubMenu=3&idOpcion=4";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarGestiones() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> listarGestiones() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> listarGestiones() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> listarGestiones() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditGestion(int accion)throws DataException{
        // accion = 104 = crea una nueva gestion, accion = 105 = modifica una gestion
        PAGE = "";
        Connection c = null;
        int idGestion = 0;
        String nombre = request.getParameter("nombre").trim();
        int year = Integer.parseInt(request.getParameter("year"));
        String fechaIni = UtilDate.convertirFechaNormal_A_fechaSql(request.getParameter("fechaIni"));
        String fechaFin = UtilDate.convertirFechaNormal_A_fechaSql(request.getParameter("fechaFin"));
        int idTipoGestion = Integer.parseInt(request.getParameter("idTipoGestion"));
        int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            GestionManager gmanager = ManagerFactory.getGestionManagerInstance(c);
            Gestion g = new Gestion();
            g.setNombre(nombre);
            g.setYear(year);
            g.setFechaIni(fechaIni);
            g.setFechaFin(fechaFin);
            g.setIdTipoGestion(idTipoGestion);
            g.setIdFacultad(idFacultad);
            if(accion == 104){
                idGestion = gmanager.getIdGestion();
                g.setIdGestion(idGestion);
                g.setEstado(Integer.parseInt(request.getParameter("estado")));
                gmanager.saveGestion(g);
                msg = "<p style='text-align:center;color:blue'>La gestión ''"+nombre.toUpperCase()+"'' se registro correctamente!</p>";
            }else{
                idGestion = Integer.parseInt(request.getParameter("idGestion"));
                g.setIdGestion(idGestion);
                gmanager.updateGestion(g);
                msg = "<p style='text-align:center;color:blue'>La gestión ''"+nombre.toUpperCase()+"'' se modifico correctamente!</p>";
            }
            this.showGestiones(gmanager.getGestVigentesYfuturos(), gmanager.getGestPasadas(), msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditGestion() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditGestion() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditGestion() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditGestion() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void deleteGestion()throws DataException{
        // accion = 106 = elimina una gestion
        PAGE = "";
        Connection c = null;
        int idGestion = Integer.parseInt(request.getParameter("idGestion"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            GestionManager gmanager = ManagerFactory.getGestionManagerInstance(c);
            if(!gmanager.isUseInMatricula(idGestion)){
                if(!gmanager.isUseInInscrito(idGestion)){
                    gmanager.deleteGestion(idGestion);
                    msg = "<p style='text-align:center;color:blue'>La gestión ''"+nombre.toUpperCase()+"'' se elimino correctamente con sus dependencias!</p>";
                }else
                    msg = "<p style='text-align:center;color:red'>No se puede eliminar la gestión ''"+nombre.toUpperCase()+"'', ¡existe alumnos inscritos para dicha gestión!</p>";
            }else{
                msg = "<p style='text-align:center;color:red'>No se puede eliminar la gestión ''"+nombre.toUpperCase()+"'', ¡ya compraron matrícula para dicha gestión!</p>";
            }
            this.showGestiones(gmanager.getGestVigentesYfuturos(), gmanager.getGestPasadas(), msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> deleteGestion() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> deleteGestion() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> deleteGestion() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> deleteGestion() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void cerrarGestion()throws DataException{
        // accion = 107 = cierra una gestion
        PAGE = "";
        Connection c = null;
        int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
        int idGestion = Integer.parseInt(request.getParameter("idGestion"));
        String nombre = request.getParameter("nombre");
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            GestionManager gmanager = ManagerFactory.getGestionManagerInstance(c);
            gmanager.cerrarGestion(idGestion, idFacultad);
            msg = "<p style='text-align:center;color:blue'>La gestión ''"+nombre.toUpperCase()+"'' se cerro correctamente!</p>";
            this.showGestiones(gmanager.getGestVigentesYfuturos(), gmanager.getGestPasadas(), msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> cerrarGestion() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> cerrarGestion() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> cerrarGestion() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> cerrarGestion() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    private void showGestiones(List<Gestion> gestiones, List<Gestion> gestionesPasadas, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Gestiones Vigente y Futuras</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Anadir Nueva Gestión' onclick='$.fn.addGestion()'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr><!--  -->");
        out.println("            <th width='5%' class='th_decoradoRowspan'>CIUDAD</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>UNID.EDUCATIVA</th>");
        out.println("            <th width='15%' class='th_decoradoRowspan'>GESTION</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>ESTADO</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>AÑO</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>FECHA INI.</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>FECHA FIN.</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan' colspan='3'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        String aux = "";
        int idFacultadAnt = 0;
        int estadoAnt = 0;
        for(Gestion g : gestiones){
            if(g.getEstado() == 1)
                aux = "VIGENTE";
            else
                aux = "EN ESPERA";
            out.println("        <tr class='tr_decorado'>");
            out.println("            <td class='th_decorado'>"+g.getFacultad().getDepartamento().getSigla()+"</td>");
            out.println("            <td class='th_decorado'>"+g.getFacultad().getNombre()+"</td>");
            out.println("            <td class='th_decorado'>"+g.getNombre()+"</td>");
            out.println("            <td class='th_decorado'>"+aux+"</td>");
            out.println("            <td class='th_decorado'>"+g.getYear()+"</td>");
            out.println("            <td class='th_decorado'>"+g.getFechaIni()+"</td>");
            out.println("            <td class='th_decorado'>"+g.getFechaFin()+"</td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            if(g.getEstado() == 1)
                out.println("                <input type='button' value='Cerrar Gesti&oacute;n' onclick='$.fn.closeGest("+g.getIdFacultad()+","+g.getIdGestion()+",\""+g.getNombre()+", de la facultad "+g.getFacultad().getNombre()+"\")' class='botonRep' title='Pulsa aqui para cerrar la gestión'/>");
            else
                out.println("&nbsp;");
            out.println("            </td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("                <input type='button' value='Editar' onClick='$.fn.editar("+g.getIdFacultad()+","+g.getIdGestion()+",\""+g.getNombre()+", de la facultad "+g.getFacultad().getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de baja la gestion'/>");
            out.println("            </td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("                <input type='button' value='Eliminar' onClick='$.fn.eliminar("+g.getIdGestion()+",\""+g.getNombre()+", de la facultad "+g.getFacultad().getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar la gestion'/>");
            out.println("            </td>");
            out.println("        </tr>");
            out.println("        <input type='hidden' name='year' id='year"+g.getIdGestion()+"' value='"+g.getYear()+"' />");
            out.println("        <input type='hidden' name='fechaIni' id='fechaIni"+g.getIdGestion()+"' value='"+g.getFechaIni()+"' />");
            out.println("        <input type='hidden' name='fechaFin' id='fechaFin"+g.getIdGestion()+"' value='"+g.getFechaFin()+"' />");
            out.println("        <input type='hidden' name='estado' id='estado"+g.getIdGestion()+"' value='"+g.getEstado()+"' />");
            out.println("        <input type='hidden' name='idTipoGestion' id='idTipoGestion"+g.getIdGestion()+"' value='"+g.getIdTipoGestion()+"' />");
            out.println("        <input type='hidden' name='nomTipoGestion' id='nomTipoGestion"+g.getIdGestion()+"' value='"+g.getNomTipoGestion()+"' />");
            i++;
            if(i != 1 && idFacultadAnt != g.getIdFacultad())
                out.println("<input type='hidden' name='ultimoEstado' id='ultimoEstado"+idFacultadAnt+"' value='"+estadoAnt+"' />");
            estadoAnt = g.getEstado();
            idFacultadAnt = g.getIdFacultad();
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='10' style='text-align:center'><span style='color:red'>No existe gestion vigente!</span></td>");
            out.write("</tr>");
        }else
            out.println("<input type='hidden' name='ultimoEstado' id='ultimoEstado"+idFacultadAnt+"' value='"+estadoAnt+"' />");
        out.println("    </tbody>");
        out.println("</table>");
        out.println("<br/>");
        out.println("<h2 class='decorado'>Gestiones Pasadas</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr><!--  -->");
        out.println("            <th width='5%' class='th_decoradoRowspan'>CIUDAD</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>UNID.EDUCATIVA</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>GESTION</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>AÑO</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>ESTADO</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>FECHA INI.</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>FECHA FIN.</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(Gestion g : gestionesPasadas){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado'>"+g.getFacultad().getDepartamento().getSigla()+"</td>");
            out.println("    <td class='th_decorado'>"+g.getFacultad().getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+g.getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+g.getYear()+"</td>");
            out.println("    <td class='th_decorado'>GESTION PASADA</td>");
            out.println("    <td class='th_decorado'>"+g.getFechaIni()+"</td>");
            out.println("    <td class='th_decorado'>"+g.getFechaFin()+"</td>");
            out.println("</tr>");
            i++;
        }
            if(i == 1){
                out.write("<tr class='tr_decorado'>");
                out.write("     <td class='td_decorado' colspan='7' style='text-align:center'><span style='color:red'>No existen gestiones pasadas!</span></td>");
                out.write("</tr>");
            }
        out.println("    </tbody>");
        out.println("</table>");
    }
    
    public void newEditPensum(int accion)throws DataException{
        // accion = 108 = registra un pensum de una carrera, accion = 109 = edita un pensum
        PAGE = "";
        Connection c = null;
        int idPensum = 0;
        int idGestionIni = Integer.parseInt(request.getParameter("idGestionIni"));
        int idGestionFin = Integer.parseInt(request.getParameter("idGestionFin"));
        int numMaterias = Integer.parseInt(request.getParameter("numMaterias"));
        int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            PensumManager pmanager = ManagerFactory.getPensumManagerInstance(c);
            
            Pensum p = new Pensum();
            p.setIdGestionIni(idGestionIni);
            p.setIdGestionFin(idGestionFin);
            p.setIdCarrera(idCarrera);
            p.setNumMaterias(numMaterias);
            if(accion == 108){
                idPensum = pmanager.getIdPensum();
                p.setIdPensum(idPensum);
                p.setVigente(true);
                pmanager.savePensum(p);
                msg = "<p style='text-align:center;color:blue'>El pensum se registro correctamente!</p>";
            }else{
                idPensum = Integer.parseInt(request.getParameter("idPensum"));
                p.setIdPensum(idPensum);
                pmanager.updatePensum(p);
                msg = "<p style='text-align:center;color:blue'>El pensum se modifico correctamente!</p>";
            }
            Pensum pensum = pmanager.getPensumVigente(idCarrera);
            Carrera carrera = cmanager.getCarreraBasic(idCarrera);
            this.showPensums(carrera, pensum, pmanager.getPensumsInactivos(idCarrera), msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditPensum() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditPensum() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditPensum() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditPensum() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void darBajaPensum()throws DataException{
        // accion = 110 = dar baja
        PAGE = "";
        Connection c = null;
        int idPensum = Integer.parseInt(request.getParameter("idPensum"));
        int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
        try{
            c = Conector.getConexion();
            PensumManager pmanager = ManagerFactory.getPensumManagerInstance(c);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            pmanager.darBajaPensum(idPensum);
            msg = "<p style='text-align:center;color:blue'>El pensum se dió de baja correctamente!</p>";
            Pensum pensum = pmanager.getPensumVigente(idCarrera);
            Carrera carrera = cmanager.getCarreraBasic(idCarrera);
            this.showPensums(carrera, pensum, pmanager.getPensumsInactivos(idCarrera), msg);
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> darBajaPensum() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> darBajaPensum() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> darBajaPensum() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> darBajaPensum() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    private void showPensums(Carrera carrera, Pensum pVigente, List<Pensum> pensumPasadas, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>PENSUM VIGENTE DE LA ESPECIALIDAD "+carrera.getNombre()+"</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Nuevo Pensum' onclick='$.fn.addPensum()'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("       <tr>");
        out.println("           <th width='5%' class='th_decoradoRowspan' colspan='8'>PENSUM VIGENTE DE LA ESPECIALIDAD "+carrera.getNombre()+"</th>");
        out.println("       </tr>");
        out.println("        <tr>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>MATERIAS</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>GESTION INICIO</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>AÑO</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>GESTION FIN</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>AÑO</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan' colspan='3'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        if(pVigente.getIdPensum() != 0){
            out.println("        <tr class='tr_decorado'>");
            out.println("            <td class='th_decorado'>"+pVigente.getNumMaterias()+"</td>");
            out.println("            <td class='th_decorado'>"+pVigente.getGestionIni().getNombre()+"</td>");
            out.println("            <td class='th_decorado'>"+pVigente.getGestionIni().getYear()+"</td>");
            out.println("            <td class='th_decorado'>"+pVigente.getGestionFin().getNombre()+"</td>");
            out.println("            <td class='th_decorado'>"+pVigente.getGestionFin().getYear()+"</td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("               <input type='button' value='Plan de Estudios' onclick='$.fn.verPlanEstudio("+pVigente.getIdCarrera()+","+pVigente.getIdPensum()+")' class='botonRep' title='Pulsa aqui para ver el plan de estudio.'/>");
            out.println("            </td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("               <input type='button' value='Editar' onclick='$.fn.editar("+pVigente.getIdPensum()+","+pVigente.getIdGestionIni()+","+pVigente.getIdGestionFin()+","+pVigente.getNumMaterias()+")' class='botonRep' title='Pulsa aqui para modificar el pensum'/>");
            out.println("            </td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("               <input type='button' value='Dar Baja' onClick='$.fn.darBaja("+pVigente.getIdPensum()+","+pVigente.getIdGestionFin()+")' class='botonRep' title='Pulsa aqui para dar de baja el pensum'/>");
            out.println("            </td>");
            out.println("        </tr>");
        }else{
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='8' style='text-align:center'><span style='color:red'>No existe pensum registrado para la especialidad ''"+carrera.getNombre()+"''!</span></td>");
            out.write("</tr>");
            out.write("<input type='hidden' name='noExisteVig' id='noExisteVig' value='false'/>");
        }
        out.println("    </tbody>");
        out.println("</table>");
        out.println("<br/>");
        if(pensumPasadas.size() > 0){
            out.println("<br/>");
            out.println("<h2 class='decorado'>Pensum inactivos de la especialidad ''"+carrera.getNombre()+"''</h2>");
            out.println("<table class='tabla_decorado' style='width: 100%'>");
            out.println("    <thead>");
            out.println("        <tr>");
            out.println("            <th width='10%' class='th_decoradoRowspan'>MATERIAS</th>");
            out.println("            <th width='30%' class='th_decoradoRowspan'>GESTION INICIO</th>");
            out.println("            <th width='10%' class='th_decoradoRowspan'>AÑO</th>");
            out.println("            <th width='30%' class='th_decoradoRowspan'>GESTION FIN</th>");
            out.println("            <th width='10%' class='th_decoradoRowspan'>AÑO</th>");
            out.println("            <th width='10%' class='th_decoradoRowspan'>ACCION</th>");
            out.println("        </tr>");
            out.println("    </thead>");
            out.println("    <tbody>");
            for(Pensum p : pensumPasadas){
                out.println("<tr class='tr_decorado'>");
                out.println("    <td class='th_decorado'>"+p.getNumMaterias()+"</td>");
                out.println("    <td class='th_decorado'>"+p.getGestionIni().getNombre()+"</td>");
                out.println("    <td class='th_decorado'>"+p.getGestionIni().getYear()+"</td>");
                out.println("    <td class='th_decorado'>"+p.getGestionFin().getNombre()+"</td>");
                out.println("    <td class='th_decorado'>"+p.getGestionFin().getYear()+"</td>");
                out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
                out.println("         <input type='button' value='Plan de Estudios' onclick='$.fn.verPlanEstudio("+p.getIdCarrera()+")' class='botonRep' title='Pulsa aqui para ver el plan de estudio.'/>");
                out.println("    </td>");
                out.println("</tr>");
            }
            out.println("    </tbody>");
            out.println("</table>");
        }
    }
    
    public void verPlanEstudio()throws DataException{
        // accion = 111 = lista el plan de estudios de un pensum
        Connection c = null;
        int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
        int idPensum = Integer.parseInt(request.getParameter("idPensum"));
        try{
            c = Conector.getConexion();
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            MateriaPensumManager mpmanager = ManagerFactory.getMateriaPensumManagerInstance(c);
            MateriaManager mmanager = ManagerFactory.getMateriaManagerInstance(c);
            Carrera carrera = cmanager.getCarreraBasic(idCarrera);
            
            request.setAttribute("idPensum", idPensum);
            request.setAttribute("carrera", carrera);
            request.setAttribute("mps", mpmanager.getPlanEstPensum(idPensum));
            request.setAttribute("mpInactivos", mpmanager.getPlanEstPensumInactivos(idPensum));
            request.setAttribute("ofertasM", mmanager.getMateriasPropuesto(idPensum,idCarrera));
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminAcademico/Carrera/planEstudios.jsp?idMenu=1&idSubMenu=3&idOpcion=2";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> verPlanEstudio() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error! en Administracion -> verPlanEstudio() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! en Administracion -> verPlanEstudio() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Error en Administracion -> verPlanEstudio() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newPlanEstudio()throws DataException{ 
        // accion = 112 = new plan estudio
        PAGE = "";
        Connection c = null;
        try{
            int level = Integer.parseInt(request.getParameter("level"));
            boolean electiva = Boolean.parseBoolean(request.getParameter("electiva"));
            int idMateriaPadre = Integer.parseInt(request.getParameter("idPadre"));
            int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            int idMateria = Integer.parseInt(request.getParameter("idMateria"));
            int idPensum = Integer.parseInt(request.getParameter("idPensum"));
            String nomMateria = request.getParameter("nomMateria");
            String nomCarrera = request.getParameter("nomCarrera");
            
            c = Conector.getConexion();
            c.setAutoCommit(false);
            MateriaPensumManager mpmanager = ManagerFactory.getMateriaPensumManagerInstance(c);
            MateriaManager mmanager = ManagerFactory.getMateriaManagerInstance(c);
            
            MateriaPensum mp = new MateriaPensum();
            mp.setIdPensum(idPensum);
            mp.setIdCarrera(idCarrera);
            mp.setIdMateria(idMateria);
            mp.setLevel(level);
            mp.setElectiva(electiva);
            if(idMateriaPadre == 0){
                mp.setIdPensumPa(0);
                mp.setIdCarreraPa(0);
                mp.setIdMateriaPa(0);
            }else{
                mp.setIdPensumPa(idPensum);
                mp.setIdCarreraPa(idCarrera);
                mp.setIdMateriaPa(idMateriaPadre);
            }
            mp.setActivo(true);
            
            mpmanager.saveMateriaPensum(mp);
            msg = "<p style='text-align:center;color:blue'>La materia ''"+nomMateria+"'' se registro correctamente al plan de estudios!</p>";
            this.showMateriasPlanEst(mpmanager.getPlanEstPensum(idPensum), mpmanager.getPlanEstPensumInactivos(idPensum), mmanager.getMateriasPropuesto(idPensum,idCarrera), nomCarrera, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newPlanEstudio() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newPlanEstudio() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newPlanEstudio() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newPlanEstudio() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void bajaAltaMatPen(int accion)throws DataException{
        // accion = 113 = dar baja materia del plan de estudio, accion = 114 = dar alta mataria del plan de estudio
        PAGE = "";
        Connection c = null;
        try{
            int idPensum = Integer.parseInt(request.getParameter("idPensum"));
            int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            int idMateria = Integer.parseInt(request.getParameter("idMateria"));
            String nomMateria = request.getParameter("nomMateria");
            String nomCarrera = request.getParameter("nomCarrera");
            
            c = Conector.getConexion();
            c.setAutoCommit(false);
            MateriaPensumManager mpmanager = ManagerFactory.getMateriaPensumManagerInstance(c);
            MateriaManager mmanager = ManagerFactory.getMateriaManagerInstance(c);
            if(accion == 113){
                mpmanager.darBajaElectiva(idPensum, idCarrera, idMateria);
                msg = "<p style='text-align:center;color:blue'>La materia ''"+nomMateria+"'' se dio de BAJA correctamente!</p>";
            }else{
                mpmanager.darAltaElectiva(idPensum, idCarrera, idMateria);
                msg = "<p style='text-align:center;color:blue'>La materia ''"+nomMateria+"'' se dio de ALTA correctamente!</p>";
            }
            
            this.showMateriasPlanEst(mpmanager.getPlanEstPensum(idPensum), mpmanager.getPlanEstPensumInactivos(idPensum), mmanager.getMateriasPropuesto(idPensum,idCarrera), nomCarrera, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaMateria() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaMateria() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> darAltaBajaMateria() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> darAltaBajaMateria() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void eliminarMatPen()throws DataException{
        // accion = 115 = elimina materia del plan de estudio
        PAGE = "";
        Connection c = null;
        try{
            int idPensum = Integer.parseInt(request.getParameter("idPensum"));
            int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            int idMateria = Integer.parseInt(request.getParameter("idMateria"));
            String nomMateria = request.getParameter("nomMateria");
            String nomCarrera = request.getParameter("nomCarrera");
            
            c = Conector.getConexion();
            c.setAutoCommit(false);
            MateriaPensumManager mpmanager = ManagerFactory.getMateriaPensumManagerInstance(c);
            MateriaManager mmanager = ManagerFactory.getMateriaManagerInstance(c);
            if(!mpmanager.isUseForDelete(idPensum, idCarrera, idMateria)){
                mpmanager.deleteMatPensum(idPensum, idCarrera, idMateria);
                msg = "<p style='text-align:center;color:blue'>La materia ''"+nomMateria+"'' se elimino correctamente con sus dependencias!</p>";
            }else{
                msg = "<p style='text-align:center;color:red'>La materia ''"+nomMateria+"'' no se puede eliminar del plan de estudio. Está siendo usado, se sugiere dar de baja!</p>";
            }
            
            this.showMateriasPlanEst(mpmanager.getPlanEstPensum(idPensum), mpmanager.getPlanEstPensumInactivos(idPensum), mmanager.getMateriasPropuesto(idPensum,idCarrera), nomCarrera, msg);
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> eliminarMatPen() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> eliminarMatPen() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> eliminarMatPen() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> eliminarMatPen() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    private void showMateriasPlanEst(List<MateriaPensum> mps, List<MateriaPensum> mpInactivos, List<Materia> ofertasM, String nomCarrera, String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Plan de Estudios ''"+nomCarrera+"''</h2>");
        out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Anadir Materia' onclick='$.fn.addMateria()'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='4%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='4%' class='th_decoradoRowspan'>NIVEL</th>");
        out.println("            <th width='40%' class='th_decoradoRowspan'>MATERIA</th>");
        out.println("            <th width='7%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='40%' class='th_decoradoRowspan'>REQUISITO</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>ACCION</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 1;
        List<MateriaPensum> electivas = new ArrayList<MateriaPensum>();
        for(MateriaPensum mp : mps){
            if(!mp.isElectiva()){
                out.println("<tr class='tr_decorado'>");
                out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
                out.println("    <td class='th_decorado'>"+mp.getLevel()+"</td>");
                out.println("    <td class='th_decorado'>"+mp.getMateria().getNombre()+"</td>");
                out.println("    <td class='th_decorado'>"+mp.getMateria().getSigla()+"</td>");
                out.println("    <td class='th_decorado'>"+mp.getPadreMateria().getMateria().getNombre()+"</td>");
                out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
                out.println("        <input type='button' value='Eliminar' onclick='$.fn.eliminar("+mp.getIdPensum()+","+mp.getIdCarrera()+","+mp.getIdMateria()+",\""+mp.getMateria().getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar la materia del pensum.'/>");
                out.println("    </td>");
                out.println("</tr>");
                i++;
            }else{
                electivas.add(mp);
            }
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='6' style='text-align:center'><span style='color:red'>No existe materias en el Plan de Estudios!</span></td>");
            out.write("</tr>");
        }
        out.println("   </tbody>");
        out.println("</table>");
        
        // ELECTIVAS
        out.println("<h2 class='decorado'>Materias Electivas</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='4%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='4%' class='th_decoradoRowspan'>NIVEL</th>");
        out.println("            <th width='39%' class='th_decoradoRowspan'>MATERIA</th>");
        out.println("            <th width='7%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='38%' class='th_decoradoRowspan'>REQUISITO</th>");
        out.println("            <th width='8%' class='th_decoradoRowspan' colspan='2'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        for(MateriaPensum mp : electivas){
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+mp.getLevel()+"</td>");
            out.println("    <td class='th_decorado'>"+mp.getMateria().getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+mp.getMateria().getSigla()+"</td>");
            out.println("    <td class='th_decorado'>"+mp.getPadreMateria().getMateria().getNombre()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Dar Baja' onclick='$.fn.darBaja("+mp.getIdPensum()+","+mp.getIdCarrera()+","+mp.getIdMateria()+",\""+mp.getMateria().getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de baja la materia.'/>");
            out.println("    </td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("        <input type='button' value='Eliminar' onclick='$.fn.eliminar("+mp.getIdPensum()+","+mp.getIdCarrera()+","+mp.getIdMateria()+",\""+mp.getMateria().getNombre()+"\")' class='botonRep' title='Pulsa aqui para eliminar la materia del pensum.'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='7' style='text-align:center'><span style='color:red'>No existe materias ELECTIVAS en el Plan de Estudios!</span></td>");
            out.write("</tr>");
        }
        out.println("   </tbody>");
        out.println("</table>");
        
        out.println("<!-- boton que muestra y oculta los departamentos dedos de baja -->");
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar bajas'/></td>");
        out.println("    </tr>");
        out.println("</table>      <br/><br/>");
        
        // =========================== MATERIAS DADOS DE BAJA ============================
        out.println("<div id='materiasBaja' style='display:none'>");
        
        out.println("<h2 class='decorado'>Materias del Plan de Estudio dados de Baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='4%' class='th_decoradoRowspan'>Nº</th>");
        out.println("            <th width='4%' class='th_decoradoRowspan'>NINEL</th>");
        out.println("            <th width='35%' class='th_decoradoRowspan'>MATERIA</th>");
        out.println("            <th width='7%' class='th_decoradoRowspan'>SIGLA</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan'>TIPO MATERIA</th>");
        out.println("            <th width='35%' class='th_decoradoRowspan'>REQUISITO</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>ACCION</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 1;
        String tipoM = "";
        for(MateriaPensum mp : mpInactivos){
            if(mp.isElectiva())
                tipoM = "ELECTIVA";
            else
                tipoM = "OBLIGATORIO";
            out.println("<tr class='tr_decorado'>");
            out.println("    <td class='th_decorado' style='text-align: center'>"+i+"</td>");
            out.println("    <td class='th_decorado'>"+mp.getLevel()+"</td>");
            out.println("    <td class='th_decorado'>"+mp.getMateria().getNombre()+"</td>");
            out.println("    <td class='th_decorado'>"+mp.getMateria().getSigla()+"</td>");
            out.println("    <td class='th_decorado'>"+tipoM+"</td>");
            out.println("    <td class='th_decorado'>"+mp.getPadreMateria().getMateria().getNombre()+"</td>");
            out.println("    <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("       <input type='button' value='Dar Alta' onClick='$.fn.darAlta("+mp.getIdPensum()+","+mp.getIdCarrera()+","+mp.getIdMateria()+",\""+mp.getMateria().getNombre()+"\")' class='botonRep' title='Pulsa aqui para dar de alta la materia'/>");
            out.println("    </td>");
            out.println("</tr>");
            i++;
        }
        if(i == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='7' style='text-align:center'><span style='color:red'>No existen materias dados de baja!<span></td>");
            out.write("</tr>");
        }
        out.println("</tbody>");
        out.println("</table><br/>");
        out.println("</div> <!-- end id='materiasBaja' -->");
        
        i=0;
        out.println("<script>");
        out.println(" ofertasM = new Array()");
        for(Materia m:ofertasM){
            out.println(" ofertasM["+i+"] = new Array("+m.getIdMateria()+",'"+m.getNombre()+"')");
            i++;
        }
        i=0;
        out.println(" materiasR = new Array()");
        for(MateriaPensum mp:mps){
            out.println(" materiasR["+i+"] = new Array("+mp.getIdMateria()+","+mp.getLevel()+",'"+mp.getMateria().getNombre()+"')");
            i++;
        }
        out.println("</script>");
    }
    
    public void indexIti()throws DataException{
        // accion = 116 = muestra el itinerario de grupos 
        Connection c = null;
        try{
            int idCarrera = 0;
            c = Conector.getConexion();
            ParametroManager pmanager = ManagerFactory.getParametroManagerInstance(c);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            Parametro p = pmanager.getParametro();
            if(p.isVentaMatriculaXfacultad()){
                DetalleAdministrativoManager damanager = ManagerFactory.getDetalleAdministrativoManagerInstance(c);
                DetalleAdministrativo da = damanager.getDetalleAdministBasic(s_Usuario.getIdUsuario());
                request.setAttribute("carreras", cmanager.getCarrerasAllByFacul(da.getIdFacultad()));
            }else{
                request.setAttribute("carreras", cmanager.getCarrerasAll());
            }
            if(request.getParameter("idCarrera") != null){
                idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
                ItinerarioGrupoManager igmanager = ManagerFactory.getItinerarioGrupoManagerInstance(c);
                request.setAttribute("idCarrera", idCarrera);
                request.setAttribute("grupos", igmanager.getItiGruposAllPorCarr(idCarrera));
                request.setAttribute("nomCarrera", request.getParameter("nomCarrera"));
            }
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/ItinerarioGrupos/grupos.jsp?idMenu=1&idSubMenu=5";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> verIti() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> verIti() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> verIti() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> verIti() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void verItiGrupos()throws DataException{ 
        // accion = 117 = muestra el itinerario de grupos por carrera 
        PAGE = "";
        Connection c = null;
        try{
            int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            String nomCarrera = request.getParameter("nomCarrera");
            
            c = Conector.getConexion();
            ItinerarioGrupoManager igmanager = ManagerFactory.getItinerarioGrupoManagerInstance(c);
            this.showItiGrupos(igmanager.getItiGruposAllPorCarr(idCarrera), idCarrera, nomCarrera,"");
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> verItiGrupos() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> verItiGrupos() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> verItiGrupos() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> verItiGrupos() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void formNewEditItiGrupo(int accion)throws DataException{
        // accion = 118 = registra new itinerario grupo, accion = 119 = form edit itinerario grupo
        Connection c = null;
        try{
            int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            int idItinerarioGrupo = 0;
            
            c = Conector.getConexion();
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            UsuarioManager umanager = ManagerFactory.getUsuarioManagerInstance(c);
            MateriaManager mmanager = ManagerFactory.getMateriaManagerInstance(c);
            DiaSemanaManager dsmanager = ManagerFactory.getDiaSemanaManagerInstance(c);
            HorarioManager hmanager = ManagerFactory.getHorarioManagerInstance(c);
            AulaManager amanager = ManagerFactory.getAulaManagerInstance(c);
            
            request.setAttribute("diasSemana", dsmanager.getDiasHorario());
            Carrera ca = cmanager.getCarreraBasic(idCarrera);
            request.setAttribute("horarios", hmanager.getHorarios(ca.getIdFacultad()));
            request.setAttribute("aulas", amanager.getAulasPorFacultad(ca.getIdFacultad()));
            if(accion != 118){
                ItinerarioGrupoManager igmanager = ManagerFactory.getItinerarioGrupoManagerInstance(c);
                idItinerarioGrupo = Integer.parseInt(request.getParameter("idItinerarioGrupo"));
                ItinerarioGrupo ig = igmanager.getItinerarioGrupo(idItinerarioGrupo);
                request.setAttribute("ItinerarioGrupo", ig);
            }
            request.setAttribute("materiasFac", mmanager.getMateriasPorFacultadBasic(ca.getIdFacultad()));
            request.setAttribute("Carrera", ca);
            request.setAttribute("carreras", cmanager.getCarrerasAllByFacul(ca.getIdFacultad()));
            request.setAttribute("docentesFac", umanager.getDocentesPorFacult(ca.getIdFacultad()));
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/ItinerarioGrupos/formGrupo.jsp?idMenu=1&idSubMenu=5";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formNewEditItiGrupo() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formNewEditItiGrupo() DataException sql "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formNewEditItiGrupo() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formNewEditItiGrupo() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void nroGrupo(int accion)throws DataException{ 
        // accion = 120 = optiene el num grupo para itinerario, accion = 129 = optiene el num para el grupo en una gestion 
        PAGE = "";
        Connection c = null;
        try{
            int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            int idMateria = Integer.parseInt(request.getParameter("idMateria"));
            PrintWriter out = response.getWriter();
            c = Conector.getConexion();
            if(accion == 120){
                ItinerarioGrupoManager igmanager = ManagerFactory.getItinerarioGrupoManagerInstance(c);
                out.println(igmanager.getNroGrupo(idCarrera, idMateria));
            }else{
                int idGestion = Integer.parseInt(request.getParameter("idGestion"));
                GrupoManager gmanager = ManagerFactory.getGrupoManagerInstance(c);
                out.println(gmanager.getNroGrupo(idGestion, idCarrera, idMateria));
            }
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> nroGrupo(int accion) DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> nroGrupo(int accion) DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> nroGrupo(int accion) ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> nroGrupo(int accion) Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditItiGrupo(int accion)throws DataException{
        // accion = 121 = registra un nuevo grupo de itinerario, accion = 122 = edita un grupo de itinerario
        PAGE = "";
        Connection c = null;
        int idItinerarioGrupo = 0;
        int idFacultad = 0;
        int idCarrera = 0;
        int idMateria = 0;
        int idDiaSemana = 0;
        int idPeriodoDia = 0;
        int idAula = 0;
        try{
            idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
            String[] carreras = request.getParameterValues("carreras");
            String[] dias = request.getParameterValues("dias");
            boolean limitado = Boolean.parseBoolean(request.getParameter("limitado"));
            ItinerarioGrupo ig = new ItinerarioGrupo();
            ig.setNroGrupo(Integer.parseInt(request.getParameter("nroGrupo")));
            ig.setLimitado(limitado);
            if(limitado)
                ig.setCupo(Integer.parseInt(request.getParameter("cupo")));
            else
                ig.setCupo(500);
            ig.setIdDocente(Integer.parseInt(request.getParameter("idDocente")));
            ig.setIdFacultad(idFacultad);
                    
            // empieza la transaccion
            c = Conector.getConexion();
            c.setAutoCommit(false);
            ItinerarioGrupoManager igmanager = ManagerFactory.getItinerarioGrupoManagerInstance(c);
            ItinerarioGrupoMateriaManager igmmanager = ManagerFactory.getItinerarioGrupoMateriaManagerManager(c);
            ItinerarioHorarioManager ihmanager = ManagerFactory.getItinerarioHorarioManagerInstance(c);
            
            List<ItinerarioGrupoMateria> igmaterias = new ArrayList<ItinerarioGrupoMateria>();
            List<ItinerarioHorario> ihorarios = new ArrayList<ItinerarioHorario>();
            if(accion == 121){
                idItinerarioGrupo = igmanager.getIdItinerarioGrupo();
                ig.setIdItinerarioGrupo(idItinerarioGrupo);
                igmanager.saveItinerarioGrupo(ig);
                // insertamos itinerario_grupo_materia
                for(String val:carreras){
                    idCarrera = Integer.parseInt(val);
                    idMateria = Integer.parseInt(request.getParameter("idMateria_"+idCarrera));
                    ItinerarioGrupoMateria igm = new ItinerarioGrupoMateria();
                    igm.setIdCarrera(idCarrera);
                    igm.setIdMateria(idMateria);
                    igm.setIdItinerarioGrupo(idItinerarioGrupo);
                    igmaterias.add(igm);
                }
                // insertamos horarios del nuevo grupo
                for(String val:dias){
                    idDiaSemana = Integer.parseInt(val);
                    idPeriodoDia = Integer.parseInt(request.getParameter("idPeriodoDia_"+idDiaSemana));
                    idAula = Integer.parseInt(request.getParameter("idAula_"+idDiaSemana));
                    ItinerarioHorario ih = new ItinerarioHorario();
                    ih.setIdItinerarioGrupo(idItinerarioGrupo);
                    ih.setIdFacultad(idFacultad);
                    ih.setIdDiaSemana(idDiaSemana);
                    ih.setIdPeriodoDia(idPeriodoDia);
                    ih.setIdAula(idAula);
                    ihorarios.add(ih);
                }
                msg = "<p style='text-align:center;color:blue'>El Itinerario grupo se registro correctamente, verifique datos!</p>";
            }else{
                idItinerarioGrupo = Integer.parseInt(request.getParameter("idItinerarioGrupo"));
                igmanager.updateItinerarioGrupo(ig);
                // eliminamos los anteriores datos
                
                igmmanager.eliminarPorItinerarioGrupo(idItinerarioGrupo);
                ihmanager.eliminarPorItinerarioGrupo(idItinerarioGrupo);
                // insertamos itinerario_grupo_materia
                for(String val:carreras){
                    idCarrera = Integer.parseInt(val);
                    idMateria = Integer.parseInt(request.getParameter("idMateria_"+idCarrera));
                    ItinerarioGrupoMateria igm = new ItinerarioGrupoMateria();
                    igm.setIdCarrera(idCarrera);
                    igm.setIdMateria(idMateria);
                    igm.setIdItinerarioGrupo(idItinerarioGrupo);
                    igmaterias.add(igm);
                }
                // insertamos horarios del nuevo grupo
                for(String val:dias){
                    idDiaSemana = Integer.parseInt(val);
                    idPeriodoDia = Integer.parseInt(request.getParameter("idPeriodoDia_"+idDiaSemana));
                    idAula = Integer.parseInt(request.getParameter("idAula_"+idDiaSemana));
                    ItinerarioHorario ih = new ItinerarioHorario();
                    ih.setIdItinerarioGrupo(idItinerarioGrupo);
                    ih.setIdFacultad(idFacultad);
                    ih.setIdDiaSemana(idDiaSemana);
                    ih.setIdPeriodoDia(idPeriodoDia);
                    ih.setIdAula(idAula);
                    ihorarios.add(ih);
                }
                msg = "<p style='text-align:center;color:blue'>El pensum se modifico correctamente!</p>";
            }
            igmmanager.saveItiGrupoMaterias(igmaterias);
            ihmanager.saveItinerarioHorarios(ihorarios);
            // recuperamos la idCarrera y nomCarrera desde el cual se opera
            idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            String nomCarrera = request.getParameter("nomCarrera");
            PrintWriter out = response.getWriter();
            out.println(msg+" <br/>");
            out.println("<table class='miReporte' style='width: 100%'>");
            out.println("    <tr><td style='text-align: center'><input type='button' class='boton' value='Ir a lista de Grupos de Itinerario' onClick='back("+idCarrera+",\""+nomCarrera+"\")'/>&nbsp;&nbsp;</td></tr>");
            out.println("</table>");
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditItiGrupo() accion = "+accion+" DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditItiGrupo() accion = "+accion+" DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditItiGrupo() accion = "+accion+" ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditItiGrupo() accion = "+accion+" Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    
    private void showItiGrupos(List<ItinerarioGrupo> grupos,int idCarrera, String nomCarrera,String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Itinerario de Grupos de la especialidad ''"+nomCarrera+"''</h2>");
        if(msg.length() > 0)
            out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Nuevo Itinerario Grupo' onclick='$.fn.newItiGrupo("+idCarrera+")'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>MATERIA(S)</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>GRUPO</th>");
        out.println("            <th width='31%' class='th_decoradoRowspan'>DOCENTE</th>");
        out.println("            <th width='4%' class='th_decoradoRowspan'>CUPO</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>HORARIO(S)</th>");
        out.println("            <th width='10%' class='th_decoradoRowspan' colspan='2'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 0;
        int j = 1;
        String aux = "";
        for(ItinerarioGrupo ig:grupos){
            aux = "";
            List<Materia> materias = ig.getMaterias();
            if(materias.size() == 1){
                Materia m = (Materia)materias.get(0);
                aux = m.getNombre();
            }else{
                for(Materia m:materias){
                    Carrera c = m.getCarrera();
                    aux += c.getNombre()+": "+m.getNombre()+" <br/>";
                }
                i = aux.lastIndexOf(",");
                if(i != -1)
                    aux = aux.substring(0, i);
            }
            out.println("        <tr class='tr_decorado'>");
            out.println("            <td class='th_decorado'>"+aux+"</td>");
            out.println("            <td class='th_decorado'>"+ig.getNroGrupo()+"</td>");
            out.println("            <td class='th_decorado'>"+ig.getDocente().getNombre()+"</td>");
            if(ig.isLimitado())
                out.println("        <td class='th_decorado'>"+ig.getCupo()+"</td>");
            else
                out.println("        <td class='th_decorado'>ILIMITADO</td>");
            aux = "";
            for(ItinerarioHorario ih:ig.getItiHorarios()){
                aux += ih.getDiaSemana().getNombre()+", "+ih.getPeriodoDia().getHoraIni()+" - "+ih.getPeriodoDia().getHoraFin()+", Aula: "+ih.getAula().getNro()+" <br/>";
            }
            out.println("            <td class='th_decorado'>"+aux+"</td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("                <input type='button' value='Modificar' onClick='$.fn.editar("+ig.getIdItinerarioGrupo()+","+idCarrera+")' class='botonRep' title='Pulsa aqui para modificar el grupo'/>");
            out.println("            </td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("                <input type='button' value='Eliminar' onClick='$.fn.eliminar("+ig.getIdItinerarioGrupo()+","+idCarrera+","+ig.getNroGrupo()+",\""+nomCarrera+"\")' class='botonRep' title='Pulsa aqui para eliminar el GRUPO'/>");
            out.println("            </td>");
            out.println("        </tr>");
            i++;
            j++;
        }
        if(j == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='7' style='text-align:center'><span style='color:red'>No existe itinerario de grupos de la especialidad ''"+nomCarrera+"''!</span></td>");
            out.write("</tr>");
        }
        out.println("    </tbody>");
        out.println("</table>");
        out.println("<br/>");
    }
    
    public void indexH()throws DataException{ // accion = 123 = ir a index horario
        Connection c = null;
        try{
            c = Conector.getConexion();
            FacultadManager fmanager = ManagerFactory.getFacultadManagerInstance(c);
            request.setAttribute("facultades", fmanager.getFacultades());
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGeneral/AdminHorario/indexH.jsp?idMenu=1&idSubMenu=2&idOpcion=2";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> indexH() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> indexH() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void eliminarGrupoIti()throws DataException{
        // accion = 124 = eliminar un grupo de itinerario
        PAGE = "";
        Connection c = null;
        try{
            int idItinerarioGrupo = Integer.parseInt(request.getParameter("idItinerarioGrupo"));
            int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            String nomCarrera = request.getParameter("nomCarrera");
            
            c = Conector.getConexion();
            ItinerarioGrupoManager igmanager = ManagerFactory.getItinerarioGrupoManagerInstance(c);
            igmanager.deleteItinerarioGrupo(idItinerarioGrupo);
            msg = "<p style='text-align:center;color:blue'>El grupo se elimino correctamente!</p>";
            this.showItiGrupos(igmanager.getItiGruposAllPorCarr(idCarrera), idCarrera, nomCarrera, msg);
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> eliminarGrupoIti() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> eliminarGrupoIti() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> eliminarGrupoIti() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> eliminarGrupoIti() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    // desde aca administracion de grupos
    public void indexGrupos()throws DataException{
        // accion = 125 = va a index grupo
        Connection c = null;
        try{
            int idCarrera = 0;
            c = Conector.getConexion();
            ParametroManager pmanager = ManagerFactory.getParametroManagerInstance(c);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            GestionManager gmanager = ManagerFactory.getGestionManagerInstance(c);
            Parametro p = pmanager.getParametro();
            if(p.isVentaMatriculaXfacultad()){
                DetalleAdministrativoManager damanager = ManagerFactory.getDetalleAdministrativoManagerInstance(c);
                DetalleAdministrativo da = damanager.getDetalleAdministBasic(s_Usuario.getIdUsuario());
                request.setAttribute("carreras", cmanager.getCarrerasAllByFacul(da.getIdFacultad()));
                request.setAttribute("gestiones", gmanager.getGestVigentesYfuturosPorFacult(da.getIdFacultad()));
            }else{
                request.setAttribute("carreras", cmanager.getCarrerasAll());
                request.setAttribute("gestiones", gmanager.getGestVigentesYfuturos());
            }
            if(request.getParameter("idCarrera") != null){
                int idGestion = Integer.parseInt(request.getParameter("idGestion"));
                request.setAttribute("gestion",gmanager.getGestionBasic(idGestion));
                idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
                GrupoManager grmanager = ManagerFactory.getGrupoManagerInstance(c);
                request.setAttribute("grupos", grmanager.getGruposAllPorCarr(idGestion, idCarrera, true)); // grupos activos
                request.setAttribute("gruposInactivo", grmanager.getGruposAllPorCarr(idGestion, idCarrera, false)); // grupos inactivos
                request.setAttribute("idCarrera", idCarrera);
                request.setAttribute("nomCarrera", request.getParameter("nomCarrera"));
            }
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGrupos/indexGrupos.jsp?idMenu=1&idSubMenu=4";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> indexGrupos() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> indexGrupos() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> indexGrupos() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> indexGrupos() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void verGrupos()throws DataException{ 
        // accion = 126 = muestra grupos de una gestion determinada
        PAGE = "";
        Connection c = null;
        try{
            int idGestion = Integer.parseInt(request.getParameter("idGestion"));
            int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            String nomCarrera = request.getParameter("nomCarrera");
            
            c = Conector.getConexion();
            GrupoManager gmanager = ManagerFactory.getGrupoManagerInstance(c);
            GestionManager gemanager = ManagerFactory.getGestionManagerInstance(c);
            this.showGrupos(gmanager.getGruposAllPorCarr(idGestion, idCarrera, true),gmanager.getGruposAllPorCarr(idGestion, idCarrera, false),gemanager.getGestionBasic(idGestion), idCarrera, nomCarrera,"");
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> verGrupos() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> verGrupos() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> verGrupos() Exception ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> verGrupos() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void formNewEditGrupo(int accion)throws DataException{
        // accion = 127 = registra new itinerario grupo, accion = 128 = form edit itinerario grupo
        Connection c = null;
        try{
            int idGestion = Integer.parseInt(request.getParameter("idGestion"));
            int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            int idGrupo = 0;
            
            c = Conector.getConexion();
            GestionManager gemanager = ManagerFactory.getGestionManagerInstance(c);
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            UsuarioManager umanager = ManagerFactory.getUsuarioManagerInstance(c);
            MateriaManager mmanager = ManagerFactory.getMateriaManagerInstance(c);
            DiaSemanaManager dsmanager = ManagerFactory.getDiaSemanaManagerInstance(c);
            HorarioManager hmanager = ManagerFactory.getHorarioManagerInstance(c);
            AulaManager amanager = ManagerFactory.getAulaManagerInstance(c);
            
            request.setAttribute("diasSemana", dsmanager.getDiasHorario());
            Carrera ca = cmanager.getCarreraBasic(idCarrera);
            request.setAttribute("horarios", hmanager.getHorarios(ca.getIdFacultad()));
            request.setAttribute("aulas", amanager.getAulasPorFacultad(ca.getIdFacultad()));
            if(accion != 127){
                GrupoManager gmanager = ManagerFactory.getGrupoManagerInstance(c);
                idGrupo = Integer.parseInt(request.getParameter("idGrupo"));
                request.setAttribute("Grupo", gmanager.getGrupo(idGestion, idGrupo));
            }
            request.setAttribute("Gestion", gemanager.getGestion(idGestion));
            request.setAttribute("materiasFac", mmanager.getMateriasPorFacultadBasic(ca.getIdFacultad()));
            request.setAttribute("Carrera", ca);
            request.setAttribute("carreras", cmanager.getCarrerasAllByFacul(ca.getIdFacultad()));
            request.setAttribute("docentesFac", umanager.getDocentesPorFacult(ca.getIdFacultad()));
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/AdminGrupos/formGrupo.jsp?idMenu=1&idSubMenu=4";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formNewEditItiGrupo() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formNewEditItiGrupo() DataException sql "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formNewEditItiGrupo() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formNewEditItiGrupo() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void newEditGrupo(int accion)throws DataException{
        // accion = 130 = registra un nuevo grupo, accion = 131 = edita un grupo
        PAGE = "";
        Connection c = null;
        int idGestion = 0;
        int idGrupo = 0;
        int idFacultad = 0;
        int idCarrera = 0;
        int idMateria = 0;
        int idDiaSemana = 0;
        int idPeriodoDia = 0;
        int idAula = 0;
        try{
            idGestion = Integer.parseInt(request.getParameter("idGestion"));
            idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
            String[] carreras = request.getParameterValues("carreras");
            String[] dias = request.getParameterValues("dias");
            boolean limitado = Boolean.parseBoolean(request.getParameter("limitado"));
            Grupo g = new Grupo();
            g.setIdGestion(idGestion);
            g.setNroGrupo(Integer.parseInt(request.getParameter("nroGrupo")));
            g.setLimitado(limitado);
            if(limitado)
                g.setCupo(Integer.parseInt(request.getParameter("cupo")));
            else
                g.setCupo(500);
            g.setInscritos(0);// se crea con cero inscripciones
            g.setMotivoBaja("");
            g.setActivo(true);
            g.setIdDocente(Integer.parseInt(request.getParameter("idDocente")));
            // empieza la transaccion
            c = Conector.getConexion();
            c.setAutoCommit(false);
            PensumManager pmanager = ManagerFactory.getPensumManagerInstance(c);
            GrupoManager gmanager = ManagerFactory.getGrupoManagerInstance(c);
            GrupoMateriaManager gmmanager = ManagerFactory.getGrupoMateriaManagerInstance(c);
            GrupoHorarioManager ghmanager = ManagerFactory.getGrupoHorarioManagerInstance(c);
            
            Pensum pensumV = pmanager.getPensumVigenteBasic(Integer.parseInt(request.getParameter("idCarrera")));
            List<GrupoMateria> gmaterias = new ArrayList<GrupoMateria>();
            List<GrupoHorario> ghorarios = new ArrayList<GrupoHorario>();
            if(accion == 130){
                idGrupo = gmanager.getIdGrupo(idGestion);
                g.setIdGrupo(idGrupo);
                gmanager.saveGrupo(g);
                // insertamos itinerario_grupo_materia
                for(String val:carreras){
                    idCarrera = Integer.parseInt(val);
                    idMateria = Integer.parseInt(request.getParameter("idMateria_"+idCarrera));
                    GrupoMateria gm = new GrupoMateria();
                    gm.setIdGestion(idGestion);
                    gm.setIdGrupo(idGrupo);
                    gm.setIdPensum(pensumV.getIdPensum());
                    gm.setIdCarrera(idCarrera);
                    gm.setIdMateria(idMateria);
                    gmaterias.add(gm);
                }
                // insertamos horarios del nuevo grupo
                for(String val:dias){
                    idDiaSemana = Integer.parseInt(val);
                    idPeriodoDia = Integer.parseInt(request.getParameter("idPeriodoDia_"+idDiaSemana));
                    idAula = Integer.parseInt(request.getParameter("idAula_"+idDiaSemana));
                    GrupoHorario gh = new GrupoHorario();
                    gh.setIdGestion(idGestion);
                    gh.setIdGrupo(idGrupo);
                    gh.setIdFacultad(idFacultad);
                    gh.setIdPeriodoDia(idPeriodoDia);
                    gh.setIdDiaSemana(idDiaSemana);
                    gh.setIdAula(idAula);
                    ghorarios.add(gh);
                }
                msg = "<p style='text-align:center;color:blue'>El grupo se registro correctamente, verifique datos!</p>";
            }else{
                idGrupo = Integer.parseInt(request.getParameter("idGrupo"));
                g.setIdGrupo(idGrupo);
                gmanager.updateGrupo(g);
                // eliminamos los anteriores datos
                gmmanager.eliminarPorGrupo(idGestion, idGrupo);
                ghmanager.eliminarPorGrupo(idGestion, idGrupo);
                // insertamos itinerario_grupo_materia
                for(String val:carreras){
                    idCarrera = Integer.parseInt(val);
                    idMateria = Integer.parseInt(request.getParameter("idMateria_"+idCarrera));
                    GrupoMateria gm = new GrupoMateria();
                    gm.setIdGestion(idGestion);
                    gm.setIdGrupo(idGrupo);
                    gm.setIdPensum(pensumV.getIdPensum());
                    gm.setIdCarrera(idCarrera);
                    gm.setIdMateria(idMateria);
                    gmaterias.add(gm);
                }
                // insertamos horarios del nuevo grupo
                for(String val:dias){
                    idDiaSemana = Integer.parseInt(val);
                    idPeriodoDia = Integer.parseInt(request.getParameter("idPeriodoDia_"+idDiaSemana));
                    idAula = Integer.parseInt(request.getParameter("idAula_"+idDiaSemana));
                    GrupoHorario gh = new GrupoHorario();
                    gh.setIdGestion(idGestion);
                    gh.setIdGrupo(idGrupo);
                    gh.setIdFacultad(idFacultad);
                    gh.setIdPeriodoDia(idPeriodoDia);
                    gh.setIdDiaSemana(idDiaSemana);
                    gh.setIdAula(idAula);
                    ghorarios.add(gh);
                }
                msg = "<p style='text-align:center;color:blue'>El pensum se modifico correctamente!</p>";
            }
            gmmanager.saveGrupoMaterias(gmaterias);
            ghmanager.saveGrupoHorarios(ghorarios);
            // recuperamos la idCarrera y nomCarrera desde el cual se opera
            idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            String nomCarrera = request.getParameter("nomCarrera");
            PrintWriter out = response.getWriter();
            out.println(msg+" <br/>");
            out.println("<table class='miReporte' style='width: 100%'>");
            out.println("    <tr><td style='text-align: center'><input type='button' class='boton' value='Ir a lista de Grupos de Itinerario' onClick='back("+idGestion+","+idCarrera+",\""+nomCarrera+"\")'/>&nbsp;&nbsp;</td></tr>");
            out.println("</table>");
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditGrupo() accion = "+accion+", DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditGrupo() accion = "+accion+", DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> newEditGrupo() accion = "+accion+", ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> newEditGrupo() accion = "+accion+", Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    public void eliminarGrupo()throws DataException{
        // accion = 132 = eliminar un grupo
        PAGE = "";
        Connection c = null;
        try{
            int idGestion = Integer.parseInt(request.getParameter("idGestion"));
            int idGrupo = Integer.parseInt(request.getParameter("idGrupo"));
            int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            String nomCarrera = request.getParameter("nomCarrera");
            
            c = Conector.getConexion();
            GrupoManager gmanager = ManagerFactory.getGrupoManagerInstance(c);
            GestionManager gemanager = ManagerFactory.getGestionManagerInstance(c);
            if(!gmanager.isUseForDelete(idGestion, idGrupo)){
                gmanager.deleteGrupo(idGestion, idGrupo);
                msg = "<p style='text-align:center;color:blue'>El grupo se elimino correctamente!</p>";
            }else
                msg = "<p style='text-align:center;color:red'>No puede eliminar el grupo, existen alumnos inscritos!</p>";
            this.showGrupos(gmanager.getGruposAllPorCarr(idGestion, idCarrera, true),gmanager.getGruposAllPorCarr(idGestion, idCarrera, false),gemanager.getGestionBasic(idGestion), idCarrera, nomCarrera,msg);
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> eliminarGrupo() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> eliminarGrupo() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> eliminarGrupo() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> eliminarGrupo() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void existeInscritosEnElGrupo()throws DataException{
        // accion = 133 = eliminar un grupo
        PAGE = "";
        Connection c = null;
        try{
            int idGestion = Integer.parseInt(request.getParameter("idGestion"));
            int idGrupo = Integer.parseInt(request.getParameter("idGrupo"));
            PrintWriter out = response.getWriter();
            c = Conector.getConexion();
            GrupoManager gmanager = ManagerFactory.getGrupoManagerInstance(c);
            if(!gmanager.isUseForDelete(idGestion, idGrupo)){ // existe alumnos inscritos
                out.println("0");
            }else
                out.println("1");
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> existeInscritosEnElGrupo() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> existeInscritosEnElGrupo() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> existeInscritosEnElGrupo() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> existeInscritosEnElGrupo() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void darBajaAltaGrupo(int accion)throws DataException{
        // accion = 134 = dar baja grupo, accion = 135 = dar alta grupo
        PAGE = "";
        Connection c = null;
        try{
            int idGestion = Integer.parseInt(request.getParameter("idGestion"));
            int idGrupo = Integer.parseInt(request.getParameter("idGrupo"));
            int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
            String nomCarrera = request.getParameter("nomCarrera");
            String motivoBaja = request.getParameter("motivoBaja");
            c = Conector.getConexion();
            GrupoManager gmanager = ManagerFactory.getGrupoManagerInstance(c);
            GestionManager gemanager = ManagerFactory.getGestionManagerInstance(c);
            Grupo g = new Grupo();
            g.setIdGestion(idGestion);
            g.setIdGrupo(idGrupo);
            if(accion == 134){// dar de baja
                g.setMotivoBaja(motivoBaja);
                g.setActivo(false);
                gmanager.darBajaGrupo(g);
                msg = "<p style='text-align:center;color:blue'>El grupo se dio de baja correctamente!</p>";
            }else{// dar de alta
                g.setMotivoBaja(motivoBaja+", dado alta el "+UtilDate.getDateTime());
                g.setActivo(true);
                gmanager.darAltaGrupo(g);
                msg = "<p style='text-align:center;color:blue'>El grupo se dio de alta correctamente!</p>";
            }
            this.showGrupos(gmanager.getGruposAllPorCarr(idGestion, idCarrera, true),gmanager.getGruposAllPorCarr(idGestion, idCarrera, false),gemanager.getGestionBasic(idGestion), idCarrera, nomCarrera,msg);
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> eliminarGrupo() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> eliminarGrupo() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> eliminarGrupo() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> eliminarGrupo() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    private void showGrupos(List<Grupo> grupos,List<Grupo> gruposInactivo,Gestion gestion,int idCarrera, String nomCarrera,String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Grupos de la especialidad ''"+nomCarrera+"'', gesti&oacute;n ''"+gestion.getNombre()+"''</h2>");
        if(msg.length() > 0)
            out.println(msg);
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' class='boton' value='Nuevo Grupo' onclick='$.fn.newGrupo("+gestion.getIdGestion()+","+idCarrera+")'/></td>");
        out.println("    </tr>");
        out.println("</table>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>MATERIA(S)</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>GRUPO</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>DOCENTE</th>");
        out.println("            <th width='4%' class='th_decoradoRowspan'>CUPO</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>INSCRITOS</th>");
        out.println("            <th width='22%' class='th_decoradoRowspan'>HORARIO(S)</th>");
        out.println("            <th width='14%' class='th_decoradoRowspan' colspan='3'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 0;
        int j = 1;
        String aux = "";
        for(Grupo g : grupos){
            aux = "";
            List<MateriaPensum> materiasP = g.getMateriasPensum();
            if(materiasP.size() == 1){
                Materia m = (Materia)materiasP.get(0).getMateria();
                aux = m.getNombre();
            }else{
                for(MateriaPensum mp:materiasP){
                    Carrera c = mp.getMateria().getCarrera();
                    aux += c.getNombre()+": "+mp.getMateria().getNombre()+" <br/>";
                }
                i = aux.lastIndexOf(",");
                if(i != -1)
                    aux = aux.substring(0, i);
            }
            out.println("        <tr class='tr_decorado'>");
            out.println("            <td class='th_decorado'>"+aux+"</td>");
            out.println("            <td class='th_decorado'>"+g.getNroGrupo()+"</td>");
            out.println("            <td class='th_decorado'>"+g.getDocente().getNombre()+"</td>");
            if(g.isLimitado())
                out.println("        <td class='th_decorado'>"+g.getCupo()+"</td>");
            else
                out.println("        <td class='th_decorado'>ILIMITADO</td>");
            out.println("            <td class='th_decorado'>"+g.getInscritos()+"</td>");
            aux = "";
            for(GrupoHorario gh:g.getGrupoHorarios()){
                aux += gh.getDiaSemana().getNombre()+", "+gh.getPeriodoDia().getHoraIni()+" - "+gh.getPeriodoDia().getHoraFin()+", Aula: "+gh.getAula().getNro()+" <br/>";
            }
            out.println("            <td class='th_decorado'>"+aux+"</td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("                <input type='button' value='Modificar' onClick='$.fn.editar("+g.getIdGestion()+","+g.getIdGrupo()+","+idCarrera+")' class='botonRep' title='Pulsa aqui para modificar el grupo'/>");
            out.println("            </td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("                <input type='button' value='Dar Baja' onClick='$.fn.darBaja("+g.getIdGestion()+","+g.getIdGrupo()+","+idCarrera+","+g.getNroGrupo()+",\""+nomCarrera+"\")' class='botonRep' title='Pulsa aqui para dar de baja'/>");
            out.println("            </td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("                <input type='button' value='Eliminar' onClick='$.fn.eliminar("+g.getIdGestion()+","+g.getIdGrupo()+","+idCarrera+","+g.getNroGrupo()+",\""+nomCarrera+"\")' class='botonRep' title='Pulsa aqui para eliminar el GRUPO'/>");
            out.println("            </td>");
            out.println("        </tr>");
            i++;
            j++;
        }
        if(j == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='9' style='text-align:center'><span style='color:red'>No existe grupos de la especialidad ''"+nomCarrera+"'' en la gesti&oacute; "+gestion.getNombre()+"!</span></td>");
            out.write("</tr>");
        }
        out.println("    </tbody>");
        out.println("</table>");
        out.println("<br/>");
        
        out.println("<!-- boton que muestra y oculta los departamentos dedos de baja -->");
        out.println("<table class='miReporte' style='width: 100%'>");
        out.println("    <tr>");
        out.println("        <td style='text-align: right'><input type='button' name='verOcultar' id='verOcultar' value='Mostrar Bajas' onclick='mostrarOcultar()' class='boton' title='Pulsa aqui para mostrar bajas'/></td>");
        out.println("    </tr>");
        out.println("</table>      <br/><br/>");

        // =========================== GRUPOS DADOS DE BJA ============================
        out.println("<div id='gruposInactivo' style='display:none'>");
        out.println("<h2 class='decorado'>Grupos dados de baja</h2>");
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='22%' class='th_decoradoRowspan'>MATERIA(S)</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>GRUPO</th>");
        out.println("            <th width='22%' class='th_decoradoRowspan'>DOCENTE</th>");
        out.println("            <th width='4%' class='th_decoradoRowspan'>CUPO</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>INSCRITOS</th>");
        out.println("            <th width='15%' class='th_decoradoRowspan'>MOTIVO DE BAJA</th>");
        out.println("            <th width='22%' class='th_decoradoRowspan'>HORARIO(S)</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>ACCIONES</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        i = 0;
        j = 1;
        aux = "";
        for(Grupo g : gruposInactivo){
            aux = "";
            List<MateriaPensum> materiasP = g.getMateriasPensum();
            if(materiasP.size() == 1){
                Materia m = (Materia)materiasP.get(0).getMateria();
                aux = m.getNombre();
            }else{
                for(MateriaPensum mp:materiasP){
                    Carrera c = mp.getMateria().getCarrera();
                    aux += c.getNombre()+": "+mp.getMateria().getNombre()+" <br/>";
                }
                i = aux.lastIndexOf(",");
                if(i != -1)
                    aux = aux.substring(0, i);
            }
            out.println("        <tr class='tr_decorado'>");
            out.println("            <td class='th_decorado'>"+aux+"</td>");
            out.println("            <td class='th_decorado'>"+g.getNroGrupo()+"</td>");
            out.println("            <td class='th_decorado'>"+g.getDocente().getNombre()+"</td>");
            if(g.isLimitado())
                out.println("        <td class='th_decorado'>"+g.getCupo()+"</td>");
            else
                out.println("        <td class='th_decorado'>ILIMITADO</td>");
            out.println("            <td class='th_decorado'>"+g.getInscritos()+"</td>");
            out.println("            <td class='th_decorado'>"+g.getMotivoBaja()+"</td>");
            aux = "";
            for(GrupoHorario gh:g.getGrupoHorarios()){
                aux += gh.getDiaSemana().getNombre()+", "+gh.getPeriodoDia().getHoraIni()+" - "+gh.getPeriodoDia().getHoraFin()+", Aula: "+gh.getAula().getNro()+" <br/>";
            }
            out.println("            <td class='th_decorado'>"+aux+"</td>");
            out.println("            <td class='td_decoradoDerecha' style='text-align: center'>");
            out.println("                <input type='button' value='Dar Alta' onClick='$.fn.darAlta("+g.getIdGestion()+","+g.getIdGrupo()+","+idCarrera+","+g.getNroGrupo()+",\""+nomCarrera+"\",\""+g.getMotivoBaja()+"\")' class='botonRep' title='Pulsa aqui para dar de Alta'/>");
            out.println("            </td>");
            out.println("        </tr>");
            i++;
            j++;
        }
        if(j == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='8' style='text-align:center'><span style='color:red'>No existe grupos dados de baja de la carrera ''"+nomCarrera+"'' en la gesti&oacute; "+gestion.getNombre()+"!</span></td>");
            out.write("</tr>");
        }
        out.println("    </tbody>");
        out.println("</table>");
        out.println("<br/>");
        out.println("</div> <!-- end id='carrerasBaja' -->");
    }
    
    public void formGenerarGrupos()throws DataException{
        // accion = 116 = muestra el itinerario de grupos 
        Connection c = null;
        try{
            c = Conector.getConexion();
            ParametroManager pmanager = ManagerFactory.getParametroManagerInstance(c);
            FacultadManager fmanager = ManagerFactory.getFacultadManagerInstance(c);
            GestionManager gemanager = ManagerFactory.getGestionManagerInstance(c);
            Parametro p = pmanager.getParametro();
            List<Facultad> facultades = new ArrayList<Facultad>();
            List<Gestion> gestiones = new ArrayList<Gestion>();
            if(p.isVentaMatriculaXfacultad()){
                DetalleAdministrativoManager damanager = ManagerFactory.getDetalleAdministrativoManagerInstance(c);
                DetalleAdministrativo da = damanager.getDetalleAdministBasic(s_Usuario.getIdUsuario());
                Facultad f = fmanager.getFacultad(da.getIdFacultad());
                facultades.add(f);
                for(Gestion g:gemanager.getGestVigentesYfuturosPorFacultBasico(da.getIdFacultad())){
                    if(!g.isItiGenerado())
                        gestiones.add(g);
                }
            }else{
                facultades = fmanager.getFacultades();
                for(Gestion g:gemanager.getGestVigentesYfuturosBasico()){
                    if(!g.isItiGenerado())
                        gestiones.add(g);
                }
            }
            request.setAttribute("facultades", facultades);
            request.setAttribute("gestiones", gestiones);
            PAGE = "WEB-INF/ADMINISTRATIVO/ADMINISTRACION/generarGrupos/formGenerarGrupos.jsp?idMenu=1&idSubMenu=6";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formGenerarGrupos() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formGenerarGrupos() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> formGenerarGrupos() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> formGenerarGrupos() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void verItiGruposPorFacultad()throws DataException{ 
        // accion = 137 = muestra los grupos de itinerario por facultad
        PAGE = "";
        Connection c = null;
        try{
            int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
            String nomFacultad = request.getParameter("nomFacultad");
            
            c = Conector.getConexion();
            ItinerarioGrupoManager igmanager = ManagerFactory.getItinerarioGrupoManagerInstance(c);
            this.showItiGruposPorFacultad(igmanager.getItiGruposAllPorFacultad(idFacultad), nomFacultad,"");
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> verItiGruposPorFacultad() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> verItiGruposPorFacultad() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> verItiGruposPorFacultad() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> verItiGruposPorFacultad() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    private void showItiGruposPorFacultad(List<ItinerarioGrupo> grupos, String nomFacultad,String msg)throws IOException{
        PrintWriter out = response.getWriter();
        out.println("<h2 class='decorado'>Itinerario de Grupos por especialidad de la Unidad Educativa ''"+nomFacultad+"''</h2>");
        if(msg.length() > 0)
            out.println(msg);
        out.println("<table class='tabla_decorado' style='width: 100%'>");
        out.println("    <thead>");
        out.println("        <tr>");
        out.println("            <th width='15%' class='th_decoradoRowspan'>ESPECIALIDAD</th>");
        out.println("            <th width='30%' class='th_decoradoRowspan'>MATERIA(S)</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'> NRO. GRUPO</th>");
        out.println("            <th width='20%' class='th_decoradoRowspan'>DOCENTE</th>");
        out.println("            <th width='5%' class='th_decoradoRowspan'>CUPO</th>");
        out.println("            <th width='25%' class='th_decoradoRowspan'>HORARIO(S)</th>");
        out.println("        </tr>");
        out.println("    </thead>");
        out.println("    <tbody>");
        int i = 0;
        int j = 1;
        String aux = "";
        for(ItinerarioGrupo ig:grupos){
            aux = "";
            List<Materia> materias = ig.getMaterias();
            if(materias.size() == 1){
                Materia m = (Materia)materias.get(0);
                aux = m.getNombre();
            }else{
                for(Materia m:materias){
                    Carrera c = m.getCarrera();
                    aux += c.getNombre()+": "+m.getNombre()+" <br/>";
                }
                i = aux.lastIndexOf(",");
                if(i != -1)
                    aux = aux.substring(0, i);
            }
            out.println("        <tr class='tr_decorado'>");
            out.println("            <td class='th_decorado'>"+ig.getAux()+"</td>");
            out.println("            <td class='th_decorado'>"+aux+"</td>");
            out.println("            <td class='th_decorado'>"+ig.getNroGrupo()+"</td>");
            out.println("            <td class='th_decorado'>"+ig.getDocente().getNombre()+"</td>");
            if(ig.isLimitado())
                out.println("        <td class='th_decorado'>"+ig.getCupo()+"</td>");
            else
                out.println("        <td class='th_decorado'>ILIMITADO</td>");
            aux = "";
            for(ItinerarioHorario ih:ig.getItiHorarios()){
                aux += ih.getDiaSemana().getNombre()+", "+ih.getPeriodoDia().getHoraIni()+" - "+ih.getPeriodoDia().getHoraFin()+", Aula: "+ih.getAula().getNro()+" <br/>";
            }
            out.println("            <td class='th_decorado'>"+aux+"</td>");
            out.println("        </tr>");
            i++;
            j++;
        }
        if(j == 1){
            out.write("<tr class='tr_decorado'>");
            out.write("     <td class='td_decorado' colspan='6' style='text-align:center'><span style='color:red'>No existe itinerario de grupos para la unidad educativa ''"+nomFacultad+"''!</span></td>");
            out.write("</tr>");
        }
        out.println("    </tbody>");
        out.println("</table>");
        out.println("<br/>");
    }
    
    public void generarGrupos()throws DataException{
        // accion = 138 = generar grupos por facultad para una gestion
        PAGE = "";
        Connection c = null;
        int idGrupo = 0;
        try{
            c = Conector.getConexion();
            c.setAutoCommit(false);
            GestionManager gemanager = ManagerFactory.getGestionManagerInstance(c);
            ParametroManager pamanager = ManagerFactory.getParametroManagerInstance(c);
            PensumManager pmanager = ManagerFactory.getPensumManagerInstance(c);
            ItinerarioGrupoManager igmanager = ManagerFactory.getItinerarioGrupoManagerInstance(c);
            ItinerarioGrupoMateriaManager igmmanager = ManagerFactory.getItinerarioGrupoMateriaManagerManager(c);
            ItinerarioHorarioManager ihmanager = ManagerFactory.getItinerarioHorarioManagerInstance(c);
            GrupoManager gmanager = ManagerFactory.getGrupoManagerInstance(c);
            GrupoMateriaManager gmmanager = ManagerFactory.getGrupoMateriaManagerInstance(c);
            GrupoHorarioManager ghmanager = ManagerFactory.getGrupoHorarioManagerInstance(c);
            // recibimos algunos parámetros :)
            int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
            int idGestion = Integer.parseInt(request.getParameter("idGestion"));
            String nomFacultad = request.getParameter("nomFacultad");
            String nomGestion = request.getParameter("nomGestion");
            
            List<ItinerarioGrupo> igrupos = igmanager.getItiGruposPorFacultadBasic(idFacultad);
            // instanciamos las listas
            List<Grupo> grupos = new ArrayList<Grupo>();
            List<GrupoMateria> gmaterias = new ArrayList<GrupoMateria>();
            List<GrupoHorario> ghorarios = new ArrayList<GrupoHorario>();
            // comensamos con el proceso
            int idPensumVigente = 0;
            int i=0;
            for(ItinerarioGrupo ig:igrupos){
                if(i==0)
                    idGrupo = gmanager.getIdGrupo(idGestion);
                Grupo g = new Grupo();
                g.setIdGestion(idGestion);
                g.setIdGrupo(idGrupo);
                g.setNroGrupo(ig.getNroGrupo());
                g.setLimitado(ig.isLimitado());
                g.setCupo(ig.getCupo());
                g.setInscritos(0);
                g.setMotivoBaja("");
                g.setActivo(true);
                g.setIdDocente(ig.getIdDocente());
                
                List<ItinerarioGrupoMateria> igmaterias = igmmanager.getItiMateriasPorGrupoBasic(ig.getIdItinerarioGrupo());
                for(ItinerarioGrupoMateria igm:igmaterias){
                    idPensumVigente = pmanager.getIdPensumVigente(igm.getIdCarrera(), igm.getIdMateria());
                    if(idPensumVigente != 0){ // verificamos si existe la materia en el pensum vigente
                        GrupoMateria gm = new GrupoMateria();
                        gm.setIdGestion(idGestion);
                        gm.setIdGrupo(idGrupo);
                        gm.setIdPensum(idPensumVigente);
                        gm.setIdCarrera(igm.getIdCarrera());
                        gm.setIdMateria(igm.getIdMateria());
                        gmaterias.add(gm);
                    }
                }
                List<ItinerarioHorario> ihorarios = ihmanager.getItiHorariosPorGrupoBasic(ig.getIdItinerarioGrupo());
                for(ItinerarioHorario ih:ihorarios){
                    GrupoHorario gh = new GrupoHorario();
                    gh.setIdGestion(idGestion);
                    gh.setIdGrupo(idGrupo);
                    gh.setIdFacultad(idFacultad);
                    gh.setIdPeriodoDia(ih.getIdPeriodoDia());
                    gh.setIdDiaSemana(ih.getIdDiaSemana());
                    gh.setIdAula(ih.getIdAula());
                    ghorarios.add(gh);
                }
                grupos.add(g);
                idGrupo++;
                i++;
            }
            gmanager.saveGrupos(grupos);
            gmmanager.saveGrupoMaterias(gmaterias);
            ghmanager.saveGrupoHorarios(ghorarios);
            gemanager.updateItiGenerado(idGestion);
            
            PrintWriter out = response.getWriter();
            out.println("<br/>");
            out.println("<h2 class='decorado'>Los grupos se generaron correctamente para la gesti&oacute;n "+nomGestion+" <br/> Unidad acad&eacute;mica &nbsp;&nbsp;''"+nomFacultad+"''</h2><br/><br/>");
            out.println("<table class='miReporte' style='width: 100%'>");
            out.println("    <tr><td style='text-align: center'><input type='button' class='boton' value='Ver Grupos Generados' onClick='verGrupos()'/></td></tr>");
            out.println("</table>");
            
            // proceso para cargar nuevamente las gestiones
            List<Gestion> gestiones = new ArrayList<Gestion>();
            Parametro p = pamanager.getParametro();
            if(p.isVentaMatriculaXfacultad()){
                for(Gestion g:gemanager.getGestVigentesYfuturosPorFacultBasico(idFacultad)){
                    if(!g.isItiGenerado())
                        gestiones.add(g);
                }
            }else{
                for(Gestion g:gemanager.getGestVigentesYfuturosBasico()){
                    if(!g.isItiGenerado())
                        gestiones.add(g);
                }
            }
            i=0;
            out.println("<script type='text/javascript'>");
            out.println(" gestiones = new Array();");
            for(Gestion g:gestiones){
                out.print(" gestiones["+i+"] = new Array("+g.getIdGestion()+","+g.getIdFacultad()+",'"+g.getNombre()+"');");
                i++;
            }
            out.println("</script>");
            c.commit();
        }catch(DataException e){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> generarGrupos() DataException sql: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> generarGrupos() DataException sql "+e.getMessage());
            PAGE = ERROR_AJAX;
        }catch(Exception ex){
            SqlManager.rollBack(c);
            System.out.println(UtilDate.getDateTime()+" Administracion -> generarGrupos() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> generarGrupos() Exception ex: "+ex.getMessage());
            PAGE = ERROR_AJAX;
        }finally{
            SqlManager.setAutoCommit(c, true);
            SqlManager.closeConexion(c);
        }
    }
    
    private void indexAdministracion() {
         PAGE = "WEB-INF/ADMINISTRATIVO/portada.jsp";
    }
}
